1.获得豆瓣影评接口
按浏览器F12调试,点开参数,查看url一栏:
所有评论:url:https://movie.douban.com/subject/27119724/comments?status=P
某一页的评论:url: https://movie.douban.com/subject/27119724/comments?start=40&limit=20&sort=new_score&status=P
对比第一条和第二条就可以得出规律,key:start表示从哪一条评论开始,key:limit表示每次展示多少条数据。所以可以用代码实现request请求,获取相应页面的数据。
2.用到了pyquery库来解析返回的html数据 :pip install pyquery
3.在print()评论的时候,出现了乱码,所以加上这一行代码可以解决:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=‘gb18030’)
4.代码实现:
#coding=utf-8
import requests
import pyquery
import io
import sys
import time
import random
#cmd不能很好地兼容utf8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
# 通过session会话访问评论内容
s = requests.session()
headers= {
#"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
#"Referer": "https://accounts.douban.com/passport/login?source=movie"
}
def data_html():
#登录请求地址
url = 'https://accounts.douban.com/j/mobile/login/basic?'
#body数据
data={
'name':'xxx', #账号
'password':'xxx', #密码
'remember':'false',
}
#发送post请求,登录豆瓣
r=requests.post(url,data=data,json='',headers=headers)
# 判断是否登录成功
if '成功' in r.text:
print('登录成功')
else:
print('登录失败')
def data_pinlun(count =0):
print("开始爬取第%d页" % int(count))
#全部评论内容
start = int(count * 20)
url2 = 'https://movie.douban.com/subject/27119724/comments?start=%d&limit=20&sort=new_score&status=P' %(start)
r2 = s.get(url2,headers=headers).content
#解析html
doc = pyquery.PyQuery(r2)
#print(doc)
items = doc('.comment-item').items()
print(items)
isover = 1
#循环读取信息
for i in items:
#评论昵称
name = i('.comment-info a').text()
if not name:
isover = 0 #如果name为空则返回0,表示结束查询
return isover
#评论内容
content = i('.short').text()
with open('12.txt','a+',encoding='utf-8') as fp:
fp.write('{name}:\n{content}\n\n'.format(name = name,content = content))
return isover
def data_data():
data_html()
count = 0
while data_pinlun(count):
count += 1
time.sleep(random.random()*3)
print('爬取完毕')
data_data()
5.检查结果
一共是爬到了220条评论。
没登录的情况下只能爬到220条。
其实这也好解决,在登录的时候,把cookie保存下来,然后在请求数据的时候将cookie添加header中,就可以获取所有页面评论,没有限制。下面是用postman来模拟获取第300-320条数据。
来源:CSDN
作者:一giao窝里giao
链接:https://blog.csdn.net/CjhLoveAndroid/article/details/103602380