2017-11-18 305 views
0

我遇到了一些麻烦,试图构建一个python机器人来检查应用程序的状态。对于解释,这里是这个过程的一个例子:如何使用Python请求,会话或dryscrape维护会话cookie(在退出时过期)?

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

2)假设查询字符串是否正确,网站将下降一个cookie。这个cookie是一个'会话cookie',因此在退出关闭或离开网页时立即过期。一旦饼干已获得访问https://examplewebsite.com/step2.do?a=sample

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

虽然这看似简单,我无法发送第二请求https://examplewebsite.com/step2.do?a=sample

3)和我经常遇到一个页面说“会话过期”。

我试图用Python请求,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') 

不幸的是,上述不工作,和一个。在第二次请求之前和之后,cookie与b.cookies不匹配。

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

+0

我试图重新创造dryscrape一个新的标签相同的效果不工作,有人可以确认,如果我传递的cookies正确吗?是否有特殊的方式来传递“会话cookie”,因为它看起来好像没有传递完整的cookie。请参阅上面的编辑。 –

+0

我曾尝试通过set_header设置Cookie信息,但仍未能使其正常工作。 我相信由于某种原因,当我通过dryscrape获取cookie时,它即将过期,可能是因为dryscrape的行为导致cookie在客户端或服务器端过期。 –

+0

仍然在这个: 我发现我可以通过dryscrape贷款第二页,如果我: 1.)访问firefox的第一页; 2.)访问firefox中的第二页: 3.)使用set_headers将第二个firefox页面加载的请求标题复制到dryscrape对象中,然后使用visit加载第二个页面。 –

回答

0

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

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

尝试是这样的:

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

希望它能帮助:)