【问题标题】:Python 3 urllib.request send cookie, fetch resultsPython 3 urllib.request 发送 cookie,获取结果
【发布时间】:2015-03-05 23:09:28
【问题描述】:

我正在尝试检索这些结果的第二页:

http://raceresults.sportstats.ca/display-results.xhtml?raceid=451

如果我点击底部的第 2 页,它会转到第 2 页,但 URL 保持不变。如果我查看 http 标头,我可以看到这个 cookie:

Set-Cookie: sportstats_preferences="{\"raceId\":451,\"firstRow\":40,
\"category\":\"All Categories\",\"chronosStep\":\"INSTRUCTIONS
\",\"facebookLoggedIn\":false,\"twitterLoggedIn\":false,\"fbServiceId
\":0,\"twServiceId\":0,\"unit\":1}"; Version=1; Max-Age=2592000; 
Expires=Sat, 04-Apr-2015 14:30:28 GMT

我可以看到这与第一页不同,firstRow 被设置为 40

我正在尝试使用以下代码在 Python 3 中获取此第二页:

#!/usr/bin/env python
import urllib.request
opener = urllib.request.build_opener()
cookie = 'sportstats_preferences="{{\\"raceId\\":451,\\"firstRow\\":40,\\"category\\":\\"All Categories\\",\\"chronosStep\\":\\"INSTRUCTIONS\\",\\"facebookLoggedIn\\":false,\\"twitterLoggedIn\\":false,\\"fbServiceId\\":0,\\"twServiceId\\":0,\\"unit\\":1}}"; Version=1; Max-Age=2592000; Expires=Sat, 04-Apr-2015 04:18:36 GMT'
opener.addheaders = [('Cookie', cookie)]
f = opener.open(url).read().decode("utf-8")
for line in f.splitlines():
    print(line)

但这仍然只是返回第一页的结果。我会以正确的方式解决这个问题吗?有什么想法可以让我获得第二页的结果吗?

【问题讨论】:

  • 我还注意到,如果我点击第二页并查看源代码,我仍然会看到第一页的数据。但是,如果我刷新页面,它将显示源中的第 2 页结果。我尝试在我的代码中打开 URL 两次,但没有帮助。
  • 它们在页面中有一个视图状态(在<input type="hidden" name="javax.faces.ViewState"...>,请参阅页面源代码),我认为服务器使用它来决定显示哪个页面。

标签: python python-3.x cookies urllib


【解决方案1】:

您最好的选择可能是使用 Selenium 和相应的 python 包。 Selenium 允许您使用 python 打开并自动控制 Web 浏览器。这将允许您与他们的下一页按钮进行交互,并在 python 脚本中读取结果。

http://www.seleniumhq.org/

https://pypi.python.org/pypi/selenium

【讨论】:

  • 感谢您的建议。这不是我希望听到的。 Selenium 看起来又重又复杂。
  • @user3449833 如果网站实际上给了你一个不同的地址来检索,或者一个文本版本,那显然会更容易。您可能会惊讶于使用 Selenium 控制 Firefox 是多么容易。查看第二个链接中的示例。你所要做的就是告诉 Selenium 如果你手动浏览你会按下哪些按钮。 Selenium 本身只会根据你的 python 包命令控制 firefox。
  • 我在无头 Linux 上,所以这无济于事,但我会调查一下。谢谢!
  • 我已经抓住了第一页,但我不知道如何“点击”。如果我使用以下方法找到一个元素: browser.find_element_by_id('mainForm:j_idt294') ,如果我添加 .click(),它就会挂起。有什么想法吗?
  • 我无法在我的计算机上测试任何这些,但请尝试这里的方法:pythoneye.com/304_19734831 - 但以与您相同的方式找到您的元素。
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多