
我们可以登录豆瓣,发现在电影的url中会有电影的id,这个id对我们爬取电影评论有帮助。
电影介绍页面有关于短评的页面,点击进入:
查看url信息,发现并无蕴含翻页等基本信息:
于是打开控制台查看具体翻页信息,查找到了具体的请求url和query:
我们知道通过这个地址get请求可以查询更多的翻页短评。
start表示开始的用户,limit表示每页的短评个数
最重要的一点是,我们如何控制最后停止的页数,我们可以发现在翻页的时候可以通过判断是否有后页来判断是否尾页。
# 判断是否尾页
def respond_yes(fin_url,soup):
article = soup.find('div', attrs={'id': 'paginator'})
# print(article)
alast = article.contents[5]
# print(alast)
ishref = len(alast.attrs)
if ishref==2:#如果标签的属性只有两个,说明没有href属性
print('已到尾页')
return 0
else:#如果标签的属性有三个或更多个,说明有href属性
print('还有下一页')
return 1
为了防止调试代码的时候多次请求get,导致被封ip,我们可以先把html内容保存到本地然后再对本地的文件进行评论搜取。
# 存requests
def save_doc(movie_id,text,i):
key = i
if not os.path.exists(f'./douban/{movie_id}/html/'):
os.makedirs(f'./douban/{movie_id}/html/')
with open(f'./douban/{movie_id}/html/{key}.html','w',encoding='utf-8') as fp:
fp.write(text)
fp.close()
PS:本例需要特别注意的一点是headers,因为后面的评论需要登录才能查看,所以在请求的时候需要在headers里设置自己的cookie还有User-Agent,否则会被识别而被禁止爬取。
登录之后可以在控制台的network内查看自己的cookie。
headers = {
'Host': 'movie.douban.com',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
'Chrome/63.0.3239.84 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,**;q=0.8',
'Referer': 'https://www.douban.com/',
'Accept-Language': 'zh-CN,zh;q=0.9',
'cookie': '*********************',
}
def get_html(url):
try:
r = requests.get(url=url,headers=headers)
r.encoding = "utf-8"
r.raise_for_status()
# print("text的状态:",r.raise_for_status())
r.encoding = r.apparent_encoding
return r.text
except Exception as result:
print("错误原因:",result)
return ''
# 判断是否尾页
def respond_yes(fin_url,soup):
article = soup.find('div', attrs={'id': 'paginator'})
# print(article)
alast = article.contents[5]
# print(alast)
ishref = len(alast.attrs)
if ishref==2:
print('已到尾页')
return 0
else:
print('还有下一页')
return 1
# 存requests的html的text于本地
def save_doc(movie_id,text,i):
key = i
if not os.path.exists(f'./douban/{movie_id}/html/'):
os.makedirs(f'./douban/{movie_id}/html/')
with open(f'./douban/{movie_id}/html/{key}.html','w',encoding='utf-8') as fp:
fp.write(text)
fp.close()
# 存评论
def save_comment(movie_id,str):
with open(f'./douban/{movie_id}/comments.txt','a+',encoding='utf-8') as fp:
print(str)
fp.write(str+'n')
fp.close()
def main():
movie_id = input('请输入你想要查找电影的id:')
absolute = "https://movie.douban.com/subject/"+str(movie_id)+"/comments?start="
query = '&limit=20&status=P&sort=new_score'
i=0 #20个短评一爬取
fin_url = absolute + str(i) + query
print(fin_url) #查看拼接最后的地址串
while True:
text = get_html(fin_url) #获取页面的html
# 存成本地html文件
save_doc(movie_id,text,i)
fp = open(f'./douban/{movie_id}/html/'+str(i)+'.html','r',encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
print(soup)
signal = respond_yes(fin_url,soup) #判断是否还有下一页
if signal:
time.sleep(5) #停止5s防止爬取过快被封ip
pass
else:
break
i = i+20 #20条数据一爬取
fin_url = absolute + str(i) + query #地址变化
# 读入每个文件找评论
i=0
strall=''
path = './douban/'+str(movie_id)+'/html/'+str(i)+'.html'
while os.path.exists(path):
print('i=',i)
fp = open(f'./douban/{movie_id}/html/' + str(i) + '.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
a = soup.find_all('div', class_='comment-item')
for j in range(len(a)):
strall = strall + a[j].find('a').get('title') + ':'
strall = strall +a[j].find('span',class_="short").text
save_comment(movie_id,strall)
strall=''
i=i+20
path = './douban/'+str(movie_id)+'/html/' + str(i) + '.html'
main()
结果截图
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)