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
mathor
V2EX  ›  Python

请教使用 Python 爬虫获取 Cookie 的问题

  •  1
     
  •   mathor · 2023-10-22 21:47:09 +08:00 · 1456 次点击
    这是一个创建于 402 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有个登录页面,网址是 http://aaaaa.com/login.jsp ,打开 f12 看到 Network 里 Cookie 当中有这么一个参数“JSESSIONID”,无论我如何刷新页面( F5 或者是 ctrl+F5 ),这个 JSESSIONID 都不会变。我输入用户名密码进行登录以后(没有验证码,只需要输入用户名密码,点击登录按钮),进入主页再看 Network ,这个 Cookie 里 JSESSIONID 的值还是没变过。

    问题来了,我用 python
    ```python
    session = requests.session()
    params = {'username': xxx, 'password': xxx}
    response1 = session.get(login_url, data=params)
    response2 = session.get(login_url, data=params)
    ```
    然后我分别打印了`response1`和`response2`的 cookie 看了一下里面的 JSESSIONID 的值,居然完全不一样,难道不应该同一个会话的 JSESSIONID 是一样的吗?

    另外还有一个问题就是,我获取 cookie ,然后传给下面的代码
    ```python
    headers = {'cookie': cookie, 'User-Agent': xxxxx, 'Host': xxxx,.....}
    response = session.post(url, headers=headers)
    print(response.text)
    ```
    如果登录成功,这个 cookie 值是有效的,那么需要登录能访问的 url ,response.text 打印出来应该是网页的内容,可是并不是,打印的结果一看就是没登录成功,很费解🤔

    ps: 环境所限,不太能使用 seleinum 这样的自动化库,只能使用爬虫。请各位大佬帮忙参谋参谋是哪儿出了问题,感谢
    9 条回复    2023-10-26 18:00:35 +08:00
    yumusb
        1
    yumusb  
       2023-10-22 21:52:45 +08:00
    建议发具体的看看
    mathor
        2
    mathor  
    OP
       2023-10-22 21:59:25 +08:00
    @yumusb sorry ,我现在不在办公室,这个网站是公司内网,因此没法发截图之类更详细的内容
    julyclyde
        3
    julyclyde  
       2023-10-22 22:12:21 +08:00
    你用浏览器对比的是:登录前、登录后
    你用 requests 对比的是:第一次登录后、第一次还没退出就执行第二次登录后
    这俩事件并不一样啊,你为什么会期望他们的 JSESSIONID 相同呢?

    第二个问题,建议你打一下 status 看看。也许是个跳转?
    jeeyong
        4
    jeeyong  
       2023-10-23 10:29:39 +08:00
    1. 先访问页面, res = requests.get...
    2. cookies = res.cookies
    3. requests.get(cookies=cookies)

    这么试试呢?
    julyclyde
        5
    julyclyde  
       2023-10-23 12:04:11 +08:00
    @jeeyong 他已经用了 session 了
    1018ji
        6
    1018ji  
       2023-10-23 15:53:20 +08:00
    JSESSIONID 就是登录生成的呗,先拿浏览器登录的 cookie 测试 2 看成功吗
    DOGSO
        7
    DOGSO  
       2023-10-23 20:26:38 +08:00
    有没有一种可能,这个 JSESSIONID 与你发起的 session 是无关的,只和 login 相关,是无状态的
    fbichijing
        8
    fbichijing  
       2023-10-24 22:54:45 +08:00
    难道不是应该先抓下包吗?
    Maerd
        9
    Maerd  
       2023-10-26 18:00:35 +08:00
    requests 的 session ,作用是帮你维护一个连接池,请求同一个域的时候会复用 tcp 连接,此外就是会保留设置好的 headers 和 cookie 。http 协议是由请求和响应组成的,而 response 的 cookie ,是你接收到的 http 响应的 headers 的 set-cookie 字段,既然你登陆了两次,这个又怎么会返回一样的值呢?这个和语言无关,题主可以进一步熟悉一下 http 协议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2966 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:58 · PVG 22:58 · LAX 06:58 · JFK 09:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.