豆瓣前面的评论是不需要登录就可以get下来的的,后面到一定页数就需要验证了,不登录就爬不了。我还是采用了session先post在get 的方法
- 本人小白,不喜勿喷,一起交流,一起进步
- 代码地址:https://github.com/1400720231/Python-Spider/tree/master/session_post_douban
1、在登录界面观察需要提交的表单数据

2、找到captcha-id 和captcha-solution的位置
其中captcha-solution表示验证码的值,captcha-id表示此时验证码图片的id标号,隐藏标签,在登陆页面是这样的:

3、构建准备提交的data信息
data = {
'data = {
'captcha-id':captcha_id,
'captcha-solution':solution, # 验证码的值
'source':'movie',
'redir':'https://movie.douban.com/',
'form_email': '你的帐号',
'form_password': '你的密码',
'login':'登录'
}
}
4、获取captcha-id的值 和识别图片验证码的内容赋值给data中的captcha-solution
- 图片验证码我采用的是人工识别的方法,先下载到本地,查看内容后在用input函数输入进去
- captcha-id则是之间在html中用BeautifulSoup匹配出来
import requests
from bs4 import BeautifulSoup
from urllib.request import urlretrieve # 登录界面的url
s = requests.session()
login_url = 'https://accounts.douban.com/login'
res =s.get(login_url)
html = BeautifulSoup(res.text,'html.parser')
href_tagert = html.find_all('img',{'id':'captcha_image'}) # 验证码图片的匹配结果,此时是一个列表
solution_href = href_tagert[0]['src'] #真正的图片地址 https://....
urlretrieve(solution_href) # 下载到本地默认的图片下载保存地址了
solution = input('输入你的验证码:') # 去找到图片的下载地方,去识别然后输入
captcha_id = html.find_all('input',{'name':'captcha-id'})[0]['value'] # 获取captcha_id的值
5、先session.post再session.get
login_url = 'https://accounts.douban.com/login' # 登录界面的url
# 头号玩家你评论能看到的最后一页的地址
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
} #构建了一个头信息,保险
get_url = 'https://movie.douban.com/subject/4920389/comments?start=480&limit=20&sort=new_score&status=P&percent_type='
res = s.post(login_url,headers=headers,data=data) # 登录
res = s.get(get_url) # 登录成功后再去get评论页面,这样就可以获取所有页面的评论的html
6、完整过程:
# coding:utf-8
import requests
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
s = requests.session()
login_url = 'https://accounts.douban.com/login' # 登陆界面的url
# 最后一页评论的url
get_url = 'https://movie.douban.com/subject/4920389/comments?start=480&limit=20&sort=new_score&status=P&percent_type='
res =s.get(login_url)
html = BeautifulSoup(res.text,'html.parser')
# 验证码图片地址
href_tagert = html.find_all('img',{'id':'captcha_image'})
# 有时候没有验证码,所以我这里判断了一下
#如果有验证码存在就用构建一个有验证码信息的data,没有就构建另一个data
if len(href_tagert)==0:
data = {
'source':'movie',
'redir':'https://movie.douban.com/',
'form_email': '你的帐号',
'form_password': '你的密码',
'login':'登录'}
else:
solution_href = href_tagert[0]['src']
urlretrieve(solution_href) # 下载到本地默认的图片下载保存地址了
solution = input('输入你的验证码:')
captcha_id = html.find_all('input',{'name':'captcha-id'})[0]['value']
data = {
'captcha-id':captcha_id,
'captcha-solution':solution, # 验证码的值
'source':'movie',
'redir':'https://movie.douban.com/',
'form_email': '你的帐号',
'form_password': '你的密码',
'login':'登录'
}
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
res = s.post(login_url,headers=headers,data=data)
res = s.get(get_url)
html = BeautifulSoup(res.text, 'html.parser')
comments = html.find_all('div', {'class':'comment-item'})
for i in comments:
print(i.find('p').string)
结果:

本文介绍了一种使用Python爬取豆瓣电影评论的方法,包括处理登录验证、验证码识别等关键步骤。
1268





