python aiohttp cookie解析问题

python aiohttp cookie解析问题

最近在做毕业设计,是关于网络爬虫的,并且是使用python3.6版本async/await式的协程进行网络下载的。其中要爬取的网站需要登录,也是使用cookie保持登录状态的,于是我像使用requests时一样,准备使用session来自动保存登录cookie,以便在后续使用这个session继续爬取数据,然后发现了问题

问题

无论如何,aiohttp.ClientSession就是无法获取到cookie,后续get数据也是提示未登录!于是开始逐步回溯寻找原因

回溯

  1. 首先,查看session.post(login_url, data={'username': 'username', 'password': 'password'})的返回信息,看看登录是否成功,发现返回的json数据显示登录成功

  2. 查看1中的response中的headers信息,是否包含应有的Set-Cookie字段。发现的确有,问题不再这里,继续深入……

  3. 查看aiohttp.ClientSession源码,发现cookie信息来自于每一次的http response中的cookie叠加,但是我第一次的post请求中返回的cookie就没有成功更新到session.cookie_jar中,而且能够在头部中看到Set-Cookie,说明cookie解析出错

  4. 查看源码,发现cookie解析使用了标准库中的类http.cookies.SimpleCookie,进而查看SimpleCookie,发现它是使用正则解析的,在其中它定义了cookie的键与值合法的字符:

_LegalChars = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~:"
_UnescapedChars = _LegalChars + ' ()/<=>?@[]{}'

# 注意这两行
_LegalKeyChars  = r"\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\="
_LegalValueChars = _LegalKeyChars + r'\[\]'
  1. 他在定义的时候单独将[]两个字符排除在合法的键字符之外了,而我要爬取的网站中恰巧使用中括号作为cookie键的字符……于是就悲催的解析失败,session也就一直获取不到cookie信息,我的爬虫也就一直是未登录状态……

后续

  1. 解决办法:虽然不是个很好的办法,但是我也只想到更改标准库代码了……感觉好坑啊!为什么标准库还会出现这种问题呢,于是继续深究…..
  2. 查RFC规范,cookie的键值合法字符究竟是怎样?最后找到了mdn网站上描述的规范,发现RFC是真的很严格,贴个链接:mdn cookie
  3. 最后,还在http.cookies的源码文件中发现了这句注释:
#
# Pattern for finding cookie
#
# This used to be strict parsing based on the RFC2109 and RFC2068
# specifications.  I have since discovered that MSIE 3.0x doesn't
# follow the character rules outlined in those specs.  As a
# result, the parsing rules here are less strict.
#

所以说,不遵守规范是真的烦啊!!!

你可能感兴趣的:(python)