豆瓣模拟登陆保存Cookie后下次直接登陆失败

发布于 2022-09-06 11:45:33 字数 4035 浏览 27 评论 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 本人初学爬虫知识,如有错误恳请指出,十分感谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷月断魂刀 2022-09-13 11:45:33

在你的基础上修改了一下,首先你用cookie登录是没有问题的,但是不应该再去访问login了,你可以在浏览器里试一下登录成功后,再访问login还是需要输入用户名密码状态,所以用cookie就跳过登录,直接访问主页面。我在主页面里获取了一下登录的账号,证明是登录成功了

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_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, headers)
        log = True
# 如果没有cookie,就读入用户输入
except:
    data['form_email']=input('Please input your account:')
    data['form_password']=input('Please input your password:')
    log = False

# 获得登陆界面的验证码
def get_captcha():
    req=Session.get(login_url)
    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
    if not log:
        captcha,captcha_id=get_captcha()
        if captcha!='NULL':
            data['captcha-solution']=captcha
            data['captcha-id']=captcha_id
        # 进行登陆
        page_login=Session.post(login_url,data=data,headers=headers)
        # 为了验证是否登陆成功我将登陆返回的页面html打印出来发现登陆失败
        #print(page_login.text)
    else:
        page_login=Session.get(url,headers=headers)
    page_login_bf=BeautifulSoup(page_login.text,'html.parser')
    # 如果登陆打印登录账号
    name=page_login_bf.find_all('a',class_='bn-more')
    print(name[0].text) 
    # 将此时的cookie保存方便下次登陆
    with open('cookie', 'wb') as f:
        pickle.dump(Session.cookies,f)

if __name__=='__main__':
    login()
沙沙粒小 2022-09-13 11:45:33

cookie对应服务器端的session,都有有效期的, 不知道你的上次和这次间隔多长时间, 有没有试试立即用上次的cookie看看是不是还能登录?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文