账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    豆瓣模拟登陆保存Cookie后下次直接登陆失败
    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
    • 无尽思念 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部