【问题标题】:Python HTTP cookie jar implementation in aiohttpaiohttp 中的 Python HTTP cookie jar 实现
【发布时间】:2021-08-22 00:44:35
【问题描述】:

我正在尝试从下面的代码中实现逻辑,该代码使用 aiohttp 向谷歌搜索发出请求,我的解决方案似乎是等效的,但由于某种原因没有按需要设置 cookie。有什么帮助吗?

from http.cookiejar import LWPCookieJar
from urllib.request import Request, urlopen

USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)'
cookie_jar = LWPCookieJar(os.path.join(home_folder, '.google-cookie'))
cookie_jar.load()


def get_page(url, user_agent=None, verify_ssl=True):
    if user_agent is None:
        user_agent = USER_AGENT
    request = Request(url)
    request.add_header('User-Agent', user_agent)
    cookie_jar.add_cookie_header(request)
    response = urlopen(request)
    cookie_jar.extract_cookies(response, request)
    html = response.read()
    response.close()
    try:
        cookie_jar.save()
    except Exception:
        pass
    return html

我的解决方案:

import aiohttp

USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)'
abs_cookie_jar = aiohttp.CookieJar()
abs_cookie_jar.load('.aiogoogle-cookie')


async def get_page(url, user_agent=None, verify_ssl=True):
    if user_agent is None:
        user_agent = USER_AGENT
    async with aiohttp.ClientSession(headers={'User-Agent': user_agent}, cookie_jar=abs_cookie_jar) as session:
        response = await session.get(url)
        if response.cookies:
            abs_cookie_jar.update_cookies(cookies=response.cookies)
            abs_cookie_jar.save('.aiogoogle-cookie')
        html = await response.text()
    return html

【问题讨论】:

    标签: python cookies aiohttp cookiejar


    【解决方案1】:

    当您前往google.com 时,您会被重定向。结果,执行了 3 个 HTTP 请求,响应代码为 301、302、200(您可以通过访问 response.history 属性来显示它们)。

    Set-Cookie 标头被添加到第一个响应中,但您在 response 变量中拥有的是最后一个,它不包含 cookie。

    实施中的更新部分: abs_cookie_jar.update_cookies(cookies=response.cookies) 不需要,因为 aiohttp 会自动为所有请求执行此操作,请参阅 source

    如何解决您的解决方案:

    import aiohttp, asyncio
    
    USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)'
    abs_cookie_jar = aiohttp.CookieJar()
    abs_cookie_jar.load('.aiogoogle-cookie')
    
    async def get_page(url, user_agent=None, verify_ssl=True):
        if user_agent is None:
            user_agent = USER_AGENT
        async with aiohttp.ClientSession(headers={'User-Agent': user_agent}, cookie_jar=abs_cookie_jar) as session:
            response = await session.get(url)
    
            html = await response.text()
    
            # display redirect responses
            for resp in response.history:
                print(resp)
    
            # print cookies for human readable format
            for cookie in abs_cookie_jar:
                print(cookie)
    
            # save jar which already have response cookies
            abs_cookie_jar.save('.aiogoogle-cookie')
    
        return html
    
    loop = asyncio.get_event_loop()
    
    loop.run_until_complete(get_page('https://google.com'))
    

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 2018-10-25
      • 1970-01-01
      • 2023-03-24
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多