• 解决 urllib2 中 CookiesMiddleware 的 cookie 问题


    16IP.png

    1. 问题背景

    网络爬虫开发中,Cookie 是一项关键的技术,用于跟踪用户的身份和状态。Cookie 是服务器在客户端存储的数据,通常用于维护用户会话和保存用户的登录信息。在爬虫应用中,模拟用户行为和保持 Cookie 状态是必要的,以便访问需要登录或受限制的页面。然而,使用 urllib2 库时,有效地处理 Cookie 问题成为一项具有挑战性的任务。

    2. 解决方案

    2.1. 添加新的设置

    为了更好地管理 Cookie,我们提出了两个新的设置,以增强 CookiesMiddleware 的灵活性:

    2.1.1. dont_merge_request_cookies

    dont_merge_request_cookies 是一个设置,如果设置为 True,则 CookiesMiddleware 将忽略响应中的 Set-Cookie,并仍然保留先前请求的 Cookie。这意味着手动设置的请求 Cookie 将被保留,而不受响应 Cookie 的影响。这对于需要保持一致请求 Cookie 的情况非常有用。

    dont_merge_request_cookies = True
    
    
    • 1
    • 2
    2.1.2. dont_merge_response_cookies

    dont_merge_response_cookies 是另一个设置,如果设置为 True,则 CookiesMiddleware 将保留先前请求的 Cookie,但会忽略响应中的 Set-Cookie。这意味着用户可以自由地处理请求 Cookie,而不会被响应中的新 Cookie 覆盖。这对于只关心请求 Cookie 的情况非常有用。

    dont_merge_response_cookies = True
    
    
    • 1
    • 2

    2.2. 实现方案

    为了实现上述设置,我们需要对 urllib2 的 CookiesMiddleware 代码进行修改。以下是一个示例实现,演示了如何在处理 Cookie 时使用新设置:

    import urllib2
    
    # 创建 urllib2 的 Cookie 处理器
    cookie_handler = urllib2.HTTPCookieProcessor()
    
    # 创建 urllib2 的 Opener,将 Cookie 处理器加入其中
    opener = urllib2.build_opener(cookie_handler)
    
    # 定义请求
    url = "https://example.com"
    request = urllib2.Request(url)
    
    # 使用 Opener 发送请求
    response = opener.open(request)
    
    # 处理响应
    print(response.read())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这个示例展示了如何设置 Cookie 处理器并使用 Opener 发送请求以管理 Cookie。

    3. 优化 CookiesMiddleware 以解决 cookie bug

    3.1. 问题描述

    CookiesMiddleware 在处理请求和响应中的 cookie 时存在一些 bug。特别是在需要保留请求中的特定 cookie 信息或者忽略响应中的新 cookie 时,当前设置无法满足需求。

    3.2. 解决方案

    为了解决这个问题,我们添加了新的设置 dont_merge_request_cookies 和 dont_merge_response_cookies,使用户能够更灵活地配置 CookiesMiddleware 的行为。

    3.3. 实现方案

    上面已经提供了一个示例实现,其中包括了代理信息的设置和 CookiesMiddleware 的使用。

    4. 使用拉勾网 Cookie 获取实例

    拉勾网是一个热门的招聘网站,通常需要模拟登录并获取 Cookie 以访问一些受限制的页面。以下是一个示例代码,演示如何使用 urllib2 和 CookiesMiddleware 获取拉勾网的 Cookie:

    import urllib2
    import cookielib
    
    # 设置代理信息
    proxyHost = "www.16yun.cn"
    proxyPort = "5445"
    proxyUser = "16QMSOML"
    proxyPass = "280651"
    
    # 构建代理处理器
    proxy_handler = urllib2.ProxyHandler(
        {
            "http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
            "https": f"https://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
        }
    )
    
    # 创建 CookieJar 对象
    cookie_jar = cookielib.CookieJar()
    
    # 创建 Cookie 处理器
    cookie_handler = urllib2.HTTPCookieProcessor(cookie_jar)
    
    # 创建 urllib2 的 Opener,将代理处理器和 Cookie 处理器加入其中
    opener = urllib2.build_opener(proxy_handler, cookie_handler)
    
    # 拉勾网登录页面 URL
    login_url = "https://www.lagou.com/login/login.html"
    
    # 模拟登录请求
    login_request = urllib2.Request(
        login_url,
        data="username=your_username&password=your_password",
        headers={"User-Agent": "Mozilla/5.0"},
    )
    
    # 使用 Opener 发送登录请求
    opener.open(login_request)
    
    # 访问需要登录权限的页面
    restricted_url = "https://www.lagou.com/restricted-page.html"
    response = opener.open(restricted_url)
    
    # 处理响应
    print(response.read())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    工程压缩与解压缩
    全波形反演的深度学习方法: 第 4 章 基于正演的 FWI (草稿)
    我把微信群聊机器人项目开源
    子组件和父组件数据双向绑定
    ES6---几个优雅的运算符使用技巧(?. ??= ||= &&=)
    洛谷千题详解 | P1015 [NOIP1999 普及组] 回文数【C++、Java、Python语言】
    数据库基础
    刷一下算法
    Java中的Queue接口和Deque的使用[82]
    计算机网络课后作业2023秋
  • 原文地址:https://blog.csdn.net/Z_suger7/article/details/134534714