CookieError: Illegal Key
CookieError: Illegal Key
我正在 aiohttp 中编写网络爬虫,遇到 cookie 问题。我尝试抓取的服务器需要身份验证,为了获取经过身份验证的用户可用的页面,我需要在密钥本身中设置一个带括号的 cookie。这是一个问题,因为 aiohttp.ClientSession.cookie_jar.update_cookies
要么忽略任何非法 cookie:
session = ClientSession()
cookie = SimpleCookie("a[b]=1234;")
session.cookie_jar.update_cookies(cookie)
print([f for f in session.cookie_jar]) # empty list, cookie not set
或提出 CookieError
:
session = ClientSession()
cookie = SimpleCookie()
cookie["a[b]"] = "1234" # http.cookies.CookieError: Illegal key 'a[b]'
session.cookie_jar.update_cookies(cookie)
print([f for f in session.cookie_jar])
session = ClientSession()
session.cookie_jar.update_cookies([("a[b]", "1234")]) # http.cookies.CookieError: Illegal key 'a[b]'
print([f for f in session.cookie_jar])
可以通过访问http.cookies.Morsel
的受保护成员_key
强制设置cookie,即
session = ClientSession()
session.cookie_jar.update_cookies([("__tmp", "1234")])
for cookie in session.cookie_jar:
if cookie.key == "__tmp":
cookie._key = "a[b]"
print([f for f in session.cookie_jar]) # invalid cookie is set correctly
但这只会使问题后退一步,因为任何会话请求,例如session.get(url)
开始募集 http.cookies.CookieError
.
我无法避免发送此 cookie。我是否一直在使用 requests
等非异步库,还是有办法忽略这个问题?
aiohttp.CookieJar
被建模为遵循相应的 RFC 规范。为什么它应该处理非法 cookie 名称?
我找到了一个解决方法,虽然我不喜欢使用它,但它是比重写整个 aiohttp
:
更好的解决方案
import sys
if "http" in sys.modules:
raise ImportError("Crawler must be imported before http module")
import http.cookies
http.cookies._is_legal_key = lambda _: True
我正在 aiohttp 中编写网络爬虫,遇到 cookie 问题。我尝试抓取的服务器需要身份验证,为了获取经过身份验证的用户可用的页面,我需要在密钥本身中设置一个带括号的 cookie。这是一个问题,因为 aiohttp.ClientSession.cookie_jar.update_cookies
要么忽略任何非法 cookie:
session = ClientSession()
cookie = SimpleCookie("a[b]=1234;")
session.cookie_jar.update_cookies(cookie)
print([f for f in session.cookie_jar]) # empty list, cookie not set
或提出 CookieError
:
session = ClientSession()
cookie = SimpleCookie()
cookie["a[b]"] = "1234" # http.cookies.CookieError: Illegal key 'a[b]'
session.cookie_jar.update_cookies(cookie)
print([f for f in session.cookie_jar])
session = ClientSession()
session.cookie_jar.update_cookies([("a[b]", "1234")]) # http.cookies.CookieError: Illegal key 'a[b]'
print([f for f in session.cookie_jar])
可以通过访问http.cookies.Morsel
的受保护成员_key
强制设置cookie,即
session = ClientSession()
session.cookie_jar.update_cookies([("__tmp", "1234")])
for cookie in session.cookie_jar:
if cookie.key == "__tmp":
cookie._key = "a[b]"
print([f for f in session.cookie_jar]) # invalid cookie is set correctly
但这只会使问题后退一步,因为任何会话请求,例如session.get(url)
开始募集 http.cookies.CookieError
.
我无法避免发送此 cookie。我是否一直在使用 requests
等非异步库,还是有办法忽略这个问题?
aiohttp.CookieJar
被建模为遵循相应的 RFC 规范。为什么它应该处理非法 cookie 名称?
我找到了一个解决方法,虽然我不喜欢使用它,但它是比重写整个 aiohttp
:
import sys
if "http" in sys.modules:
raise ImportError("Crawler must be imported before http module")
import http.cookies
http.cookies._is_legal_key = lambda _: True