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