爬进一个网站,登录比较复杂所以打算用 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 的解决方案? 先谢过大家了!感谢
1
alvin666 OP 求助....
|
2
bmos 2018-08-17 21:44:59 +08:00 1
没用过 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)]> |
3
ericls 2018-08-17 21:45:50 +08:00 via iPhone 1
**params
|
4
alvin666 OP |
5
ericls 2018-08-17 23:29:04 +08:00 via iPhone
|
6
alvin666 OP @ericls 但是问题是这个 set 方法写死了前两个参必须是键值,后面可能可以用**,还是得遍历字典再用 if 组参数
|
7
punderson 2018-08-18 01:14:04 +08:00 2
|
8
OpenJerry 2018-08-18 04:36:57 +08:00 2
直接 curl 转 python 吧 https://curl.trillworks.com
|
9
gsw945 2018-08-18 09:10:22 +08:00 1
```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) ``` |
10
gsw945 2018-08-18 09:12:08 +08:00
v2ex 回复不支持 markdown?而且代码缩进也给整没了(无力...吐槽)
|
11
gsw945 2018-08-18 09:15:08 +08:00
代码缩进被吃了,说明如下:
"if 'httpOnly' in cookie:"下面有 2 行 "for cookie in cookies:"下面的语句都在 for-in 里 |
12
alvin666 OP |
13
spensersheng 2018-08-30 11:48:07 +08:00
建议不要用 cookiejar 之类的来操作 cookie,直接从 response 里的 cookie-set 的 header 来获取信息,让然如果网站 cookie 设置非常特殊则另当别论。。
|
14
alvin666 OP @spensersheng 问题是用 requests 获取 cookie 很难,多次重定向和 js 生成参数,直接用 selenium 获取到了 cookie...
|