session 验证码登录豆瓣看《头号玩家》评论

豆瓣前面的评论是不需要登录就可以get下来的的,后面到一定页数就需要验证了,不登录就爬不了。我还是采用了session先post在get 的方法

  1. 本人小白,不喜勿喷,一起交流,一起进步
  2. 代码地址:https://github.com/1400720231/Python-Spider/tree/master/session_post_douban

1、在登录界面观察需要提交的表单数据

session 验证码登录豆瓣看《头号玩家》评论_第1张图片


2、找到captcha-id 和captcha-solution的位置

其中captcha-solution表示验证码的值,captcha-id表示此时验证码图片的id标号,隐藏标签,在登陆页面是这样的:
session 验证码登录豆瓣看《头号玩家》评论_第2张图片


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

  1. 图片验证码我采用的是人工识别的方法,先下载到本地,查看内容后在用input函数输入进去
  2. 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)

结果:

session 验证码登录豆瓣看《头号玩家》评论_第3张图片
session 验证码登录豆瓣看《头号玩家》评论_第4张图片

你可能感兴趣的:(Python爬虫)