豆瓣模拟登陆保存Cookie后下次直接登陆失败
问题描述
一个模拟登陆豆瓣的python小程序,对于正常输入用户名和密码进行登陆正常,但是当我第一次登陆成功后将cookie保存下来下次使用cookie而不用用户名和密码再登陆时,却无法正常登陆。以下我将cookie的保存和读取单独写出来我的实现过程:
# 登陆成功的cookie保存
with open('cookie', 'wb') as f:
pickle.dump(Session.cookies,f)
# 登陆前检查是否有cookie并尝试读取
Session=requests.session()
# 读取是否保存有cookie
try:
with open('cookie','rb') as f:
Session.cookies=pickle.load(f)
#这里我讲读到的cookie输出
print(Session.cookies)
# 如果没有cookie,就读入用户输入
except:
data['form_email']=input('Please input your account:')
data['form_password']=input('Please input your password:')
对于读取cookie的方式,我的程序显示的确读到了之前保存的cookie:
对于程序中的print(Session.cookies)
输出如下:
<RequestsCookieJar[<Cookie as="https://www.douban.com/" for .douban.com/>, <Cookie bid=Lx54kqS0AA4 for .douban.com/>, <Cookie ck=GB1e for .douban.com/>, <Cookie dbcl2="152654498:lA0IPNlgLNQ" for .douban.com/>]>
进行登陆的语句如下:
page_login=Session.post(url,data=data,headers=headers)
但是此时我将page_login
的信息全部输入时我发现页面源代码显示账号不能为空,即登陆失败。也就是说好像豆瓣没有管我的cookie?
疑问
回答者应当对如下疑问(不仅限于)进行解释或说明:
1.为什么此时的cookie没有让我直接登入豆瓣网页?
2.应该如何解决这个问题?即如何使用上次的cookie进行成功登陆?如果可以请给出修改的代码或可行建议。
程序代码
由于我的描述可能有不足之处,如有觉得我描述的不够充分的地方可以参考我的代码(已加入注释)
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
from os import remove
from PIL import Image
import pickle
#import http.cookiejar as cookielib
url='https://www.douban.com/login'
data={'source':None,
'remember':'on'
}
headers = {'Host':'www.douban.com',
'Referer': 'https://www.douban.com/',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding':'gzip, deflate, br'}
Session=requests.session()
# 读取是否保存有cookie
try:
with open('cookie','rb') as f:
Session.cookies=pickle.load(f)
#这里我将读到的cookie输出
print(Session.cookies)
# 如果没有cookie,就读入用户输入
except:
data['form_email']=input('Please input your account:')
data['form_password']=input('Please input your password:')
# 获得登陆界面的验证码
def get_captcha():
req=requests.post(url,data=data)
page_bf=BeautifulSoup(req.text,'html.parser')
# 寻找验证码的图片(有可能不需要验证码 这时返回NULL)
try:
img_src=page_bf.find('img',id='captcha_image').get('src')
except:
return 'NULL','NULL'
# 如果需要验证码下载该验证码并打开
img=requests.get(img_src)
if img.status_code==200:
with open('captcha.jpg','wb') as f:
f.write(img.content)
image=Image.open('captcha.jpg')
image.show()
# 让用户根据验证码图片输入验证码
captcha=input('please input the captcha:')
remove('captcha.jpg')
# 由于post-data里还要求captcha-id所以我从图片网址中截取id
captcha_id=img_src[img_src.find('=')+1:]
captcha_id=captcha_id[:captcha_id.find('&')]
return captcha,captcha_id
def login():
#获得验证码和验证码id
captcha,captcha_id=get_captcha()
if captcha!='NULL':
data['captcha-solution']=captcha
data['captcha-id']=captcha_id
# 进行登陆
page_login=Session.post(url,data=data,headers=headers)
# 为了验证是否登陆成功我将登陆返回的页面html打印出来发现登陆失败
#print(page_login.text)
page_login_bf=BeautifulSoup(page_login.text,'html.parser')
# 如果登陆成功就可以找到热点新闻并打印
hot_topic=page_login_bf.find_all('a',class_='rec_topics_name')
for i,topic in enumerate(hot_topic):
print('%d.%s'%(i+1,topic.string))
# 将此时的cookie保存方便下次登陆
with open('cookie', 'wb') as f:
pickle.dump(Session.cookies,f)
if __name__=='__main__':
login()
ps 本人初学爬虫知识,如有错误恳请指出,十分感谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在你的基础上修改了一下,首先你用cookie登录是没有问题的,但是不应该再去访问login了,你可以在浏览器里试一下登录成功后,再访问login还是需要输入用户名密码状态,所以用cookie就跳过登录,直接访问主页面。我在主页面里获取了一下登录的账号,证明是登录成功了
cookie对应服务器端的session,都有有效期的, 不知道你的上次和这次间隔多长时间, 有没有试试立即用上次的cookie看看是不是还能登录?