2013-02-04 65 views
1

我试图使用机械化从网页获取信息。它基本上取得了第一批信息的成功,但该网页包含一个“Next”按钮以获取更多信息。我无法弄清楚如何以编程方式获取附加信息。Python机械化阻止连接:关闭

通过使用Live HTTP Headers,我可以看到当我单击浏览器中的下一个按钮时生成的http请求。看起来好像我可以使用机械化发出相同的请求,但在后一种情况下,我没有获取下一页,而是重定向到网站的主页。

很明显,机械化正在做一些不同于我的浏览器的东西,但我无法弄清楚什么。在比较了头,我没有找到一个差异,这是浏览器中使用

连接:保持活跃

而机械化使用

连接:关闭

我不知道这是罪魁祸首,但是当我试图添加标题('Connection','keep-alive')时,它没有改变任何东西。

[UPDATE] 当我点击按钮Firefox内“2页”,则生成的HTTP(根据活HTTP头):

GET /statistics/movies/ww_load/the-fast-and-the-furious-6-2012?authenticity_token=ItU38334Qxh%2FRUW%2BhKoWk2qsPLwYKDfiNRoSuifo4ns%3D&facebook_fans_page=2&tbl=facebook_fans&authenticity_token=ItU38334Qxh%2FRUW%2BhKoWk2qsPLwYKDfiNRoSuifo4ns%3D HTTP/1.1 
Host: www.boxoffice.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0 
Accept: text/javascript, text/html, application/xml, text/xml, */* 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
X-Requested-With: XMLHttpRequest 
X-Prototype-Version: 1.6.0.3 
Referer: http://www.boxoffice.com/statistics/movies/the-fast-and-the-furious-6-2012 
Cookie: __utma=179025207.1680379428.1359475480.1360001752.1360005948.13; __utmz=179025207.1359475480.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __qca=P0-668235205-1359475480409; zip=13421; country_code=US; _boxoffice_session=2202c6a47fc5eb92cd0ba57ef6fbd2c8; __utmc=179025207; user_credentials=d3adbc6ecf16c038fcbff11779ad16f528db8ebd470befeba69c38b8a107c38e9003c7977e32c28bfe3955909ddbf4034b9cc396dac4615a719eb47f49cc9eac%3A%3A15212; __utmb=179025207.2.10.1360005948 
Connection: keep-alive 

当我尝试请求机械化内相同的URL ,它看起来像这样:

GET /statistics/movies/ww_load/the-fast-and-the-furious-6-2012?facebook_fans_page=2&tbl=facebook_fans&authenticity_token=ZYcZzBHD3JPlupj%2F%2FYf4dQ42Kx9ZBW1gDCBuJ0xX8X4%3D HTTP/1.1 
Accept-Encoding: identity 
Host: www.boxoffice.com 
Accept: text/javascript, text/html, application/xml, text/xml, */* 
Keep-Alive: 115 
Connection: close 
Cookie: _boxoffice_session=ced53a0ca10caa9757fd56cd89f9983e; country_code=US; zip=13421; user_credentials=d3adbc6ecf16c038fcbff11779ad16f528db8ebd470befeba69c38b8a107c38e9003c7977e32c28bfe3955909ddbf4034b9cc396dac4615a719eb47f49cc9eac%3A%3A15212 
Referer: http://www.boxoffice.com/statistics/movies/the-fast-and-the-furious-6-2012 
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1 

- 达里尔

+0

如果这是个问题,那将会很奇怪。 “连接”标题只是表示服务器是否应该保持连接打开以发送另一个网页。这里浏览器正在请求连接保持打开状态,以便它可以下载图像等,但是机械化不需要这样做,因此它可以告诉服务器它已完成,并且在下次加载页面时将请求新的连接。如果您可以对这两个请求进行更完整的记录,可能会有所帮助。 –

+0

谢谢,我已更新我的问题以包含更多信息。部分问题是“下一步”按钮不仅仅是一个url,它是一个javascript调用,但最终javascript会导致一个http请求,所以看起来我应该能够直接在机械化内发出这个请求。 –

+2

不发布答案,因为我只是猜测,但服务器可能正在检查'X-Requested-With'和/或'X-Prototype-Version'。看看你是否可以复制机械化。 –

回答

1

服务器进行检查X-Requested-With和/或X-Prototype-Version,所以将这两个头添加到机械化请求中修复了它。

+0

嗨达里尔 - 你应该在这里发布答案的实际内容,因为评论可能随时消失。答案中无需提供谢意。 –

+0

事实上,我编辑了答案给你一个例子,说明我们更喜欢在这里写下答案。你不必使用我的编辑;如果你想以不同的方式写下它,请随时自行改变它。 –

+0

@Daryl McCullough,我面临同样的问题。我已经添加了“X-Requested-With”和/或“X-Prototype-Version”,但没有解决它。有什么建议么?? – 2016-01-27 10:17:28

0

也许有点晚了一个答案,但我通过添加_urllib2_forked.py的线固定这一

上线1098代表行:headers["Connection"] = "Close"

更改为:

if not 'Connection' in headers: headers["Connection"] = "Close" 和确保你在你的脚本中设置标题,它会起作用。

Gr。 Squandor