- 43
- 0
问题描述
一个模拟登陆豆瓣的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 本人初学爬虫知识,如有错误恳请指出,十分感谢
0
打赏
收藏
点击回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
