【Python爬虫教程】第7篇-requests模块的cookies保存和使用

为什么要保存cookies

保存cookies是避免每次都登录获取权限,一遍权限是有过期时间的,不需要每次重复登录,可以将cookies保存起来,用的时候再加载。适用于多机器并发式爬取数据或者抢票等功能。
在这里插入图片描述

requests.utils工具类

需要使用request.utils工具类进行解析cookie,从CookieJar转为字典,从字典转为CookieJar,需要特殊的操作。

# 将CookieJar转为字典:
cookie_dict= requests.utils.dict_from_cookiejar(r.cookies)

# 将字典转为CookieJar:
cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)

保存cookies到本地文件

def save_cookie():
    # 登录成功, session里的cookie是最全的,response返回的cookie不全
    cookiejar = requests.utils.dict_from_cookiejar(request_session.cookies)
    with open(cookie_path, "w") as f:
        json.dump(cookiejar, f, indent=True)

比如下面这个网站cookie的保存内容:
在这里插入图片描述

从本地文件解析cookies

def __load_cookie():
    '''
    加载本地cookie,如果存在加载,如果不存在就返回空
    :param session:
    :return:
    '''
    try:
        with open(cookie_path, "r") as f:
            load_cookie = json.load(f)
            return requests.utils.cookiejar_from_dict(load_cookie)
    except Exception as e:
        traceback.print_exc()
        return None

使用

将从本地解析出来的cookies同步到session中

request_session = requests.Session()
exist_cookies= requests.utils.cookiejar_from_dict(load_cookie)
request_session.cookies.update(exist_cookies)

使用实践

下面这个例子使用session方式请求,登录成功之后会调用save()保存cookie,每次重新启动程序会先加载cookies

import json
import traceback

import requests.utils

from executor.page_executor import PageExecutor
from file_path import get_absolute_path


cookie_path = get_absolute_path('data/cookie.txt')
request_session: requests.Session = None

def __load_cookie():
    '''
    加载本地cookie,如果存在加载,如果不存在就返回空
    :param session:
    :return:
    '''
    try:
        with open(cookie_path, "r") as f:
            load_cookie = json.load(f)
            return requests.utils.cookiejar_from_dict(load_cookie)
    except Exception as e:
        traceback.print_exc()
        return None

def get_session():
    global request_session
    if request_session is not None:
        return request_session
    else:
        request_session = requests.Session()
        exist_cookies = __load_cookie()
        if exist_cookies is not None:
            request_session.cookies.update(exist_cookies)

        return request_session

def save_cookie():
    # 登录成功, session里的cookie是最全的,response返回的cookie不全
    cookiejar = requests.utils.dict_from_cookiejar(request_session.cookies)
    with open(cookie_path, "w") as f:
        json.dump(cookiejar, f, indent=True)
    logger.info('cookies saved to ./data/cookie.txt')

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 15:16:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 15:16:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 15:16:04       57 阅读
  4. Python语言-面向对象

    2024-07-16 15:16:04       68 阅读

热门阅读

  1. ssh升级

    ssh升级

    2024-07-16 15:16:04      23 阅读
  2. 什么是PHP?

    2024-07-16 15:16:04       22 阅读
  3. HDFS和ES

    2024-07-16 15:16:04       19 阅读
  4. 格雷编码

    2024-07-16 15:16:04       23 阅读
  5. 外呼系统用回拨模式打电话有什么优势

    2024-07-16 15:16:04       20 阅读
  6. datawhale【第二期】nlp

    2024-07-16 15:16:04       24 阅读
  7. DVC+Minio

    2024-07-16 15:16:04       19 阅读
  8. 力扣第208题“实现 Trie (前缀树)”

    2024-07-16 15:16:04       21 阅读
  9. 地暖管的选材

    2024-07-16 15:16:04       19 阅读
  10. easyexcel使用

    2024-07-16 15:16:04       20 阅读
  11. ubuntu报Unit firewalld.service could not be found.

    2024-07-16 15:16:04       18 阅读
  12. 【数据结构】BF和KMP算法

    2024-07-16 15:16:04       21 阅读
  13. 数据结构专项-字符串

    2024-07-16 15:16:04       19 阅读
  14. Python编程实例-使用urllib3进行HTTP请求详解

    2024-07-16 15:16:04       19 阅读
  15. [ptrade交易实战] 第十四篇 公共交易函数 (2)

    2024-07-16 15:16:04       28 阅读