python爬虫-cookie登录

http/https协议的特性:无状态
模拟登录之后仍然没有请求到对应页面的信息是因为 发起第二次基于个人页面的请求时,服务器端并不知道还请求是基于用户登录的请求
cookie:用来让服务器端记录客户端相关状态
那么解决这个问题就可以有下面两种方法:

  1. 手动Cookie方法(利用浏览器抓包工具获取Cookie)
  2. 自动获取Cookie
    Cookie值的来源是模拟登录时由服务器端创建的。
    需要使用到session会话对象。可以发送请求,如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session中
    有的网站的Cookie是有有效时长或是动态变化的不推荐使用第一种方法。

Cookie登陆古诗文网

"""
验证码识别案例:登录古诗文网
"""
import requests
from lxml import etree

if __name__ == '__main__':
    # 需要用到seesion
    session = requests.Session()
    # UA伪装
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
                      "Version/14.1 Safari/605.1.15 "
    }
    # 登录页面url
    login_page_url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
    login_page = session.get(url=login_page_url, headers=headers)
    tree = etree.HTML(login_page.text)
    # 获取验证码图片
    img_url = 'https://so.gushiwen.cn' + tree.xpath('//img[@id="imgCode"]/@src')[0]
    print(img_url)
    img_data = session.get(url=img_url, headers=headers).content
    # 持久化存储
    img_path = '../data3/VerificationCode/gushi_code.jpg'
    with open(img_path, 'wb') as fp:
        fp.write(img_data)
    print("验证码图片已存储,请注意查看!")

    # 人工识别验证
    code = input("人工识别验证码为:\n")

    # post请求发送(模拟登录)
    # 对login日志中post的url发起请求
    login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
    # 携带参数
    data = {
        'from': 'http://so.gushiwen.cn/user/collect.aspx',
        'email': '你的账号',
        'pwd': '你的密码',
        'code': code,
        'denglu': '登录'
    }
    # 使用session发起post请求
    home_page = session.post(url=login_url, headers=headers, data=data)
    print(home_page.status_code)
    with open('../data3/gushi.html', 'w', encoding='utf-8') as fp:
        fp.write(home_page.text)
    print("完成")

    person_url = 'https://so.gushiwen.cn/user/collect.aspx'
    person_page = session.get(url=person_url, headers=headers)
    with open('../data3/gushi_person.html', 'w', encoding='utf-8') as fp:
        fp.write(person_page.text)
    print("完成")

验证码自己看一眼图片输入哦