1

我在尝试构建一个 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 将被服务器标记为无效。

4

1 回答 1

0

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

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

尝试这样的事情:

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

希望能帮助到你 :)

于 2018-01-21T11:33:35.423 回答