求助一个 requests 中 cookie 的问题

2018-08-17 19:57:04 +08:00
 alvin666

爬进一个网站,登录比较复杂所以打算用 selenium 得到 cookies,再用 requests 爬进去。 然而 selenium 保存的 cookie 格式是一个并列多个字典的一个列表

cookies=[{"domain": "xxxx", "httpOnly": true, "name": "JSESSIONID", "path": "/", "secure": false, "value": "asdsdsdsdsdsdsdsdsdsd"},...]

但是 requests 中 cookiejar 对象接受的是类似于{"JSESSIONID":"asdsdsdsdsdsdsdsdsdsd"}的字典,其余参数的添加需要使用 jar 的 set 方法,我使用了

for cookie in cookies:
	jar.set(cookie['name'],cookie['value'],domain=cookie['domain'],path=cookie['path'])

但是这样又有一个问题,有的 cookie 包含 expiry,有的不包含,jar.set 还不能这么写死了 我现在有个思路,怎么能够达到 cookie 这个字典里面有 expiry,就构造出来 expiry=cookie['expiry'],有 path 就构造出来相应的语句。 或者大家有更 pythonic 的解决方案? 先谢过大家了!感谢

3497 次点击
所在节点    Python
14 条回复
alvin666
2018-08-17 21:10:27 +08:00
求助....
bmos
2018-08-17 21:44:59 +08:00
没用过 requests,试试 eval,好像可行?
jar = requests.cookies.RequestsCookieJar()

eval("jar.set('tasty_cookie', 'yum', domain='xxx', path='/cookies')")
Out[14]: Cookie(version=0, name='tasty_cookie', value='yum', port=None, port_specified=False, domain='xxx', domain_specified=True, domain_initial_dot=False, path='/cookies', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)

jar
Out[15]: <RequestsCookieJar[Cookie(version=0, name='tasty_cookie', value='yum', port=None, port_specified=False, domain='xxx', domain_specified=True, domain_initial_dot=False, path='/cookies', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>
ericls
2018-08-17 21:45:50 +08:00
**params
alvin666
2018-08-17 23:13:30 +08:00
@bmos 这个格式也不好调整,因为 jar.set 方法需要前两个参数是键和值,后面的是键=值,得遍历字典构造一个符合要求的字符串,写到这里觉得虽然也不是不行,但是还是有点繁...
最烦的是 requests 对于 cookie 其他参数不太重视,selenium 保存的 cookie 又比较完整,试了很多方法都不好
@ericls params 的话是加到 header 里面吧,但是获取的 cookie 有的是其他站的不需要的,cookiejar 能够自己选择,所以还是不太好...
ericls
2018-08-17 23:29:04 +08:00
@alvin666 我的意思是 动态参数 把参数写到一个 dict 里面 有些有 expiry 有些没有 不一定每次都传

比如 a = {‘ a ’: 1, ‘ b ’: 2} 再 foo(**a)
alvin666
2018-08-17 23:50:40 +08:00
@ericls 但是问题是这个 set 方法写死了前两个参必须是键值,后面可能可以用**,还是得遍历字典再用 if 组参数
punderson
2018-08-18 01:14:04 +08:00
OpenJerry
2018-08-18 04:36:57 +08:00
直接 curl 转 python 吧 https://curl.trillworks.com
gsw945
2018-08-18 09:10:22 +08:00
```python
import requests

cookies=[
{"domain": "xxxx", "httpOnly": True, "name": "JSESSIONID", "path": "/", "secure": False, "value": "asdsdsdsdsdsdsdsdsdsd"}
# here: 你更多的 cookies-item,如果有的话
]
jar = requests.cookies.RequestsCookieJar()
for cookie in cookies:
cookie_name = cookie.pop('name', '')
cookie_value = cookie.pop('value', '')
if 'httpOnly' in cookie:
http_only = cookie.pop('httpOnly', None)
cookie['rest'] = {'HttpOnly': http_only}
jar.set(cookie_name, cookie_value, **cookie)
```
gsw945
2018-08-18 09:12:08 +08:00
v2ex 回复不支持 markdown?而且代码缩进也给整没了(无力...吐槽)
gsw945
2018-08-18 09:15:08 +08:00
代码缩进被吃了,说明如下:
"if 'httpOnly' in cookie:"下面有 2 行
"for cookie in cookies:"下面的语句都在 for-in 里
alvin666
2018-08-18 10:46:07 +08:00
@punderson 谢谢!我试一下
@OpenJerry 谢谢,这个是个好东西,不过这个网站登陆的时候跳转很多,Chrome 就算 offline 也看不到请求,只能 fiddler 抓包,所以就打算直接 selenium 得到 cookie,再 requests 搞了
spensersheng
2018-08-30 11:48:07 +08:00
建议不要用 cookiejar 之类的来操作 cookie,直接从 response 里的 cookie-set 的 header 来获取信息,让然如果网站 cookie 设置非常特殊则另当别论。。
alvin666
2018-08-30 11:58:07 +08:00
@spensersheng 问题是用 requests 获取 cookie 很难,多次重定向和 js 生成参数,直接用 selenium 获取到了 cookie...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/480848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX