V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
alvin666
V2EX  ›  Python

求助一个 requests 中 cookie 的问题

  •  
  •   alvin666 · 2018-08-17 19:57:04 +08:00 · 3504 次点击
    这是一个创建于 2325 天前的主题,其中的信息可能已经有所发展或是发生改变。

    爬进一个网站,登录比较复杂所以打算用 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 的解决方案? 先谢过大家了!感谢

    14 条回复    2018-08-30 11:58:07 +08:00
    alvin666
        1
    alvin666  
    OP
       2018-08-17 21:10:27 +08:00 via Android
    求助....
    bmos
        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)]>
    ericls
        3
    ericls  
       2018-08-17 21:45:50 +08:00 via iPhone   ❤️ 1
    **params
    alvin666
        4
    alvin666  
    OP
       2018-08-17 23:13:30 +08:00
    @bmos 这个格式也不好调整,因为 jar.set 方法需要前两个参数是键和值,后面的是键=值,得遍历字典构造一个符合要求的字符串,写到这里觉得虽然也不是不行,但是还是有点繁...
    最烦的是 requests 对于 cookie 其他参数不太重视,selenium 保存的 cookie 又比较完整,试了很多方法都不好
    @ericls params 的话是加到 header 里面吧,但是获取的 cookie 有的是其他站的不需要的,cookiejar 能够自己选择,所以还是不太好...
    ericls
        5
    ericls  
       2018-08-17 23:29:04 +08:00 via iPhone
    @alvin666 我的意思是 动态参数 把参数写到一个 dict 里面 有些有 expiry 有些没有 不一定每次都传

    比如 a = {‘ a ’: 1, ‘ b ’: 2} 再 foo(**a)
    alvin666
        6
    alvin666  
    OP
       2018-08-17 23:50:40 +08:00 via Android
    @ericls 但是问题是这个 set 方法写死了前两个参必须是键值,后面可能可以用**,还是得遍历字典再用 if 组参数
    punderson
        7
    punderson  
       2018-08-18 01:14:04 +08:00   ❤️ 2
    OpenJerry
        8
    OpenJerry  
       2018-08-18 04:36:57 +08:00   ❤️ 2
    直接 curl 转 python 吧 https://curl.trillworks.com
    gsw945
        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)
    ```
    gsw945
        10
    gsw945  
       2018-08-18 09:12:08 +08:00
    v2ex 回复不支持 markdown?而且代码缩进也给整没了(无力...吐槽)
    gsw945
        11
    gsw945  
       2018-08-18 09:15:08 +08:00
    代码缩进被吃了,说明如下:
    "if 'httpOnly' in cookie:"下面有 2 行
    "for cookie in cookies:"下面的语句都在 for-in 里
    alvin666
        12
    alvin666  
    OP
       2018-08-18 10:46:07 +08:00 via Android
    @punderson 谢谢!我试一下
    @OpenJerry 谢谢,这个是个好东西,不过这个网站登陆的时候跳转很多,Chrome 就算 offline 也看不到请求,只能 fiddler 抓包,所以就打算直接 selenium 得到 cookie,再 requests 搞了
    spensersheng
        13
    spensersheng  
       2018-08-30 11:48:07 +08:00
    建议不要用 cookiejar 之类的来操作 cookie,直接从 response 里的 cookie-set 的 header 来获取信息,让然如果网站 cookie 设置非常特殊则另当别论。。
    alvin666
        14
    alvin666  
    OP
       2018-08-30 11:58:07 +08:00 via Android
    @spensersheng 问题是用 requests 获取 cookie 很难,多次重定向和 js 生成参数,直接用 selenium 获取到了 cookie...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2475 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:35 · PVG 12:35 · LAX 20:35 · JFK 23:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.