【问题标题】:How to maintain session cookies (expire on exit) with Python requests, sessions, or dryscrape?如何使用 Python 请求、会话或 dryscrape 维护会话 cookie(退出时过期)?
【发布时间】:2017-11-18 13:09:01
【问题描述】:

我在尝试构建 python 机器人来检查应用程序的状态时遇到了一些麻烦。为了解释,这里是一个过程的例子:

1.) 访问网站 (https://examplewebsite.com/checkinfo.do?a=sample

2.) 假设查询字符串是正确的,网站将丢弃一个 cookie。此 cookie 是一个“会话 cookie”,因此在退出关闭或离开网页时立即过期。

3.) 获取 cookie 后访问https://examplewebsite.com/step2.do?a=sample

4.) 将请求结果解析到https://examplewebsite.com/step2.do?a=sample

虽然这看起来很简单,但我在向https://examplewebsite.com/step2.do?a=sample 发送第二个请求时遇到了问题,并且经常遇到一个页面说“会话已过期”。

我尝试使用 Python requests、Python requests.session 以及 dryscrape 重现此过程。但我无法让它工作 - 我的直觉是,因为 cookie 是一个“会话 cookie”,所以它会在向 https://examplewebsite.com/step2.do?a=sample 发起第二个请求时但在页面加载之前立即出现。

也许解释问题的更好方法是浏览器行为,使用 Firefox 和 IE,网站的行为如下:

1.) 访问网站 (https://examplewebsite.com/checkinfo.do?a=sample)

  • cookie成功获取

2.) 将 URL 替换为 https://examplewebsite.com/step2.do?a=sample

  • 出现“会话已过期”警告

但是,这确实有效:

1.) 访问网站(链接同上)

  • cookie成功获取

2.) 在保持第一个选项卡打开的同时,创建第二个选项卡并粘贴 https://examplewebsite.com/step2.do?a=sample进入浏览器

  • 信息已正确加载,未出现“会话已过期”警告。

所以我的问题是,如何在 Python 中重现“创建新选项卡”的行为,同时保持请求之间共享会话 cookie。

这是我在dryscrape中的尝试

import dryscrape

a = dryscrape.Session()
a.set_header("User-Agent", "Firefox")
a.visit('checkinfo.do URL')

b = dryscrape.Session()
b.set_header("User-Agent", "Firefox")
b.set_cookie(a.cookies())   #This is my attempt to share the session cookies in a seperate dryscrape object to simulate putting the URL in a second tab.
b.visit('step2.do URL')

很遗憾,上面的不行,第二次请求之前和之后a.cookies都不匹配b.cookies。

注意:网站页面确实有代码会在页面卸载时结束会话。因此,如果 dryscrape 正在执行任何相当于卸载页面的操作,则会话 cookie 将被服务器标记为无效。

【问题讨论】:

  • 我尝试重新创建与在 dryscrape 中创建新选项卡相同的效果的尝试不起作用,有人可以确认我是否正确传递了 cookie 吗?是否有一种特殊的方式来传递“会话 cookie”,因为它看起来好像没有传递完整的 cookie。请参阅上面的修改。
  • 我已尝试通过 set_header 设置 cookie 信息,但仍然无法使其正常工作。我相信由于某种原因,当我通过 dryscrape 获取 cookie 时,它​​会过期,可能是因为 dryscrape 的行为导致 cookie 在客户端或服务器端过期。
  • 仍然对此感到困惑:我发现我可以通过 dryscrape 借出第二页,如果我: 1.) 在 Firefox 中访问第一页; 2.) 在 Firefox 中访问第二个页面: 3.) 使用 set_headers 将第二个 firefox 页面加载中的请求标头复制到 dryscrape 对象中,然后使用访问来加载第二个页面。
  • 您找到解决方案了吗?

标签: python session cookies python-requests dryscrape


【解决方案1】:

现在我也遇到了类似的问题。

您的代码的问题是 a.cookies() 返回一个 cookie 列表。您需要分别设置每个 cookie。

试试这样的:

b = dryscrape.Session()
b.set_header("User-Agent", "Firefox")
for cookie in a.cookies():
    b.set_cookie(cookie)

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多