如何在Python aiohttp中优雅使用Chrome导出的Cookie?
问题描述
我正尝试使用Python的aiohttp访问某网站,目前可通过Chrome扩展导出该网站的Cookie,格式如下:
.domain.name TRUE / FALSE 1547016401 cookies values
我现在用以下代码加载Cookie:
import http.cookiejar cj = http.cookiejar.MozillaCookieJar('cookies.txt') cj.load() cookies = {} for each in cj: cookies[each.name] = each.value
并在aiohttp中这样使用:
async with ClientSession(cookies=cookies) as session:
请问是否有更优雅的实现方式?查阅了aiohttp文档但未找到相关方法。
回答
当然有更简洁优雅的方式!其实aiohttp的ClientSession本身就支持直接传入CookieJar对象,完全不需要手动把Cookie转换成字典。
你可以直接将加载好的MozillaCookieJar传给ClientSession的cookie_jar参数,aiohttp会自动处理Cookie的匹配、发送和管理,代码会清爽很多:
import http.cookiejar from aiohttp import ClientSession async def main(): # 加载Mozilla格式的Cookie文件 cj = http.cookiejar.MozillaCookieJar('cookies.txt') cj.load() # 直接传入CookieJar,无需手动转换字典 async with ClientSession(cookie_jar=cj) as session: # 发起请求时会自动带上符合规则的Cookie async with session.get('https://target-domain.name') as resp: print(await resp.text())
这种方式的优势很明显:
- 省去了手动遍历CookieJar构建字典的冗余代码,更简洁
- aiohttp会自动遵循HTTP Cookie的规则,比如域名匹配、有效期判断,比手动维护字典更可靠
- 后续如果需要更新或操作Cookie,直接在CookieJar对象上处理即可,更符合规范
另外,加载Cookie时如果遇到格式或过期问题,可以加上两个参数来兼容:
cj.load(ignore_discard=True, ignore_expires=True)
ignore_discard=True:加载那些被标记为"可丢弃"的Cookieignore_expires=True:忽略已经过期的Cookie
你可以根据自己的实际需求选择是否添加这两个参数。
内容的提问来源于stack exchange,提问作者dofine
相关产品推荐
相关产品推荐

