[41]requests与http.cookiejar的使用

46 阅读2分钟

@[toc]

requests与http.cookiejar的使用

在学习Python之余,发现Python2与Python3 有很大的变化,之前使用urllib和cookielib来保存cookie,发现很繁琐,于是改用requests。发现cookielib在3.x版本中改成了http.cookiejar。经过测试后成功保存了cookie。使用方法如下

#  requests 与 http.cookiejar相结合使用
import requests
import http.cookiejar as HC

session = requests.session()
session.cookies = HC.LWPCookieJar(filename='cookies')
#  如果存在cookies文件,则加载,如果不存在则提示
try:
  session.cookies.load(ignore_discard=True)
except:
  print('未找到cookies文件')

...
请求数据
...

session.cookies.save()

python3模拟登录知乎(requests)

# -*- coding: utf-8 -*-
""" 知乎登录分为两种登录
    一是手机登录 API : https://www.zhihu.com/login/phone_num
    二是邮箱登录 API : https://www.zhihu.com/login/email

    第一步、打开首页获取_xref值,验证图片
    第二步、输入账号密码
    第三步、看是否需要验证、要则下载验证码图片,手动输入
    第四步、判断是否登录成功、登录成功后获取页面值。

    requests 与 http.cookiejar 相结合使用
    session = requests.session()
    session.cookies = http.cookiejar.LWPCookies(filename='abc')
    ...
    请求网址后
    ...
    session.cookies.save()  保存cookies

    加载cookies
    try:
        session.cookies.load(ignore_discard=True)
    except:
        print('没有cookies')
"""
import requests
from bs4 import BeautifulSoup as BS
import time
from subprocess import Popen  # 打开图片
import http.cookiejar
import re


# 模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36'
}
home_url = "https://www.zhihu.com"
base_login = "https://www.zhihu.com/#signin/"  # 一定不能写成http,否则无法登录

session = requests.session()
session.cookies = http.cookiejar.LWPCookieJar(filename='ZhiHuCookies')
try:
    # 加载Cookies文件
    session.cookies.load(ignore_discard=True)
except:
    print("cookie未保存或cookie已过期")
    # 第一步 获取_xsrf
    _xsrf = BS(session.get(home_url, headers=headers).text, "lxml").find("input", {"name": "_xsrf"})["value"]

    # 第二步 根据账号判断登录方式
    account = input("请输入您的账号:")
    password = input("请输入您的密码:")

    # 第三步 获取验证码图片
    gifUrl = "http://www.zhihu.com/captcha.gif?r=" + str(int(time.time() * 1000)) + "&type=login"
    gif = session.get(gifUrl, headers=headers)
    # 保存图片
    with open('code.gif', 'wb') as f:
        f.write(gif.content)
    # 打开图片
    Popen('code.gif', shell=True)
    # 输入验证码
    captcha = input('captcha: ')

    data = {
        "captcha": captcha,
        "password": password,
        "_xsrf": _xsrf,
    }

    # 第四步 判断account类型是手机号还是邮箱
    if re.match("^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", account):
        # 邮箱
        data["email"] = account
        base_login = base_login + "email"
    else:
        # 手机号
        data["phone_num"] = account
        base_login = base_login + "phone_num"

    print(data)

    # 第五步 登录
    response = session.post(base_login, data=data, headers=headers)
    print(response.content.decode("utf-8"))

    # 第六步 保存cookie
    session.cookies.save()

# 获取首页信息
resp = session.get(home_url, headers=headers, allow_redirects=False)
print(resp.content.decode("utf-8"))