迁移urllib Cookie逻辑到aiohttp时Cookie设置异常问题求助
问题修复方案
代码存在的核心问题
- 冗余的Cookie手动更新逻辑:aiohttp的ClientSession绑定自定义CookieJar后,会自动在请求时携带Jar内的Cookie,响应返回后也会自动把新的Set-Cookie内容同步到绑定的CookieJar实例,你手动调用
update_cookies属于多余操作,反而可能引发Cookie覆盖异常 - Cookie保存逻辑不符合预期:原urllib逻辑是每次请求完成后都尝试保存Cookie,你仅在响应返回Set-Cookie头时才执行保存,会丢失会话Cookie的更新;同时aiohttp的CookieJar默认不保存没有过期时间的会话Cookie,需要主动加
ignore_discard=True参数才能和LWPCookieJar的默认行为对齐 - 参数未传递:你定义了
verify_ssl参数但没有传给请求的ssl字段,和原逻辑不一致 - 加载Cookie缺少异常处理:如果本地Cookie文件不存在,
load方法会直接抛出异常,无法兼容首次运行无本地Cookie的场景 - 频繁创建销毁ClientSession:虽然不会直接导致Cookie失效,但是每次请求都新建销毁会话属于不必要的开销,建议批量请求时复用Session实例
- 可选兼容特殊场景:如果是通过IP地址访问服务,或者需要允许公共后缀域名的Cookie写入,可以在初始化CookieJar时添加
unsafe=True参数,关闭严格的域名校验
修正后的实现代码
import aiohttp import os USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)' cookie_path = '.aiogoogle-cookie' # 特殊场景可添加unsafe=True参数 abs_cookie_jar = aiohttp.CookieJar() # 兼容本地Cookie文件不存在的场景 if os.path.exists(cookie_path): abs_cookie_jar.load(cookie_path) # 批量请求场景建议将Session实例提至全局复用,避免每次请求新建销毁 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, ssl=verify_ssl) html = await response.text() # 每次请求后都尝试保存Cookie,忽略无权限等异常 try: # ignore_discard=True 保存没有过期时间的会话Cookie abs_cookie_jar.save(cookie_path, ignore_discard=True) except Exception: pass return html
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

