【发布时间】: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