没有所谓的捷径
一切都是时间最平凡的累积

aiohttp.ClientSession获取的cookie不完整终极解决办法

本文最后更新于2019年8月30日,已超过80天没有更新,如果文章内容失效,请反馈给我们,谢谢!

aiohttp.ClientSession获取的cookie不完整终极解决办法

aiohttp.ClientSession不同于requests模块的session会话管理,requests.session能搜集所有的cookie,

但ClientSession没有一种方式能直接搜集所有的cookies

如下面的代码:

async with aiohttp.ClientSession() as session:
    async with session.post(url, data=args) as resp:
        print(resp.cookies)
        print(session.cookie_jar.filter_cookies('http://www.xxx.com'))

print(resp.cookies)  # 响应中的cookies只包含重定向链中最后一个请求中的Set-Cookies头信息设置的值
print(session.cookie_jar.filter_cookies('http://www.xxx.com')) # 会一直保留"http://www.xxx.com"这个网站的所有设置cookies,含有我们在会话时设置的cookie,并且会根据响应修改更新cookie

注意:是http://www.xxx.com这个网站的所有cookies,

今天就遇到爬取一个网站时,总有一个cookie丢失,而requests却很完整,

而丢失的cookie在resp.cookies和resp.headers中可以看到

Set-Cookie: admPasswd=%2ADEF9Nn2AkByNQEkNYg1vcR0AWkNYg04AmM%3D; Domain=www.xxx.cn; expires=Thu, 05-Sep-2019 16:00:00 GMT; HttpOnly; Path=/SetInManager; Secure

于是,想办法把session.cookie_jar.filter_cookies和resp.cookies合并一起,写一个函数:

def updatecookie_jar(self, cookie_jar):
    for cookie_key in cookie_jar.keys():
        self.cookies[cookie_key] = cookie_jar[cookie_key].value

我这里是在类中,所以直接把cookie都更新到类属性self.cookies中了,如果只是方法,这样写即可

def updatecookie_jar(cookie_jar):
    cookies = dict()
    for cookie_key in cookie_jar.keys():
        cookies[cookie_key] = cookie_jar[cookie_key].value
    return cookies

 

赞(1) 打赏
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除,联系邮箱:lwarm@qq.com。文章观点不代表本站立场。本站原创内容未经允许不得转载,或转载时需注明出处:红岩子 » aiohttp.ClientSession获取的cookie不完整终极解决办法
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

今天所做的努力都是在为明天积蓄力量

联系我们赞助我们