【问题标题】:Problem with urllib2 loading mobile siteurllib2 加载移动网站的问题
【发布时间】:2011-08-29 00:17:48
【问题描述】:

我正在尝试从http://m.finnkino.fi/events/now_showing 获取一些数据,但目前我失败得很厉害,因为我什至无法使用 python 加载页面源。 目前我正在使用以下代码:

req = urllib2.urlopen(URL,None,2.5)
page = req.read()
print page

这里是超时错误的回溯:

Traceback (most recent call last):
 File "user/src/finnkinoParser.py", line 26, in <module>
main()
File "user/src/finnkinoParser.py", line 13, in main
getNowPlayingMovies()
File "user/src/finnkinoParser.py", line 17, in getNowPlayingMovies
     req = urllib2.urlopen(baseURL,None,2.5)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 124, in urlopen
return _opener.open(url, data, timeout)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 383, in open
response = self._open(req, data)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 401, in _open
'_open', req)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 361, in _call_chain
result = func(*args)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 1130, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 1105, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error timed out>

如果我用我的浏览器浏览到 url,它就可以正常工作。那么有人可以告诉我是什么让该网站如此不同,因此 urllib2 无法加载页面。我想这与针对移动用户的网站有关。使用“常规”站点 urllib2 可以正常工作。有没有其他类型的网站基本 urlopen(URL) 不起作用?

感谢您的帮助

【问题讨论】:

  • 你不认为我们知道当你运行该代码时会发生什么对我们有帮助吗?它与您的预期有何不同?你得到什么错误?
  • 我也超时了。 WGET 虽然有效。所以这不是用户代理的问题,只是尝试使用自定义 urlopenener,它也不起作用。
  • 恭喜,您发现了一个非常奇怪的问题。在 python 2.7 上,它在调用 self._sock.recv 时永远挂在 socket.py 第 447 行,它是 python 内置的,没有任何关联的 python 源代码。这比 python 和 urllib2 更深入。
  • @Jathanism:不,wget和curl与Javascript无关,加载页面就好了。
  • 它不会永远挂起 - 最终我在 URLError 中得到“由对等方重置连接”。不过很奇怪——我也试过从我的浏览器中借用 UA 字符串。 Python 3.2 也好不到哪里去。有人可能想看看为 Python 打开一个错误。

标签: python urllib2


【解决方案1】:

跟随 sn-p 工作正常。

import httplib
headers = {"User-Agent": "Mozilla/5.0"}
conn = httplib.HTTPConnection("m.finnkino.fi")
conn.request("GET", "/events/now_showing", "", headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print data
conn.close()

他们的服务器似乎已经验证了几个请求变量。经过多次测试,得出以下结论:

  1. http 协议必须是 HTTP/1.1。
  2. 如果请求头有 Connection 属性,它的值应该是 keep-alive。
  3. 无论其值如何,请求标头都必须具有 User-Agent 属性。

在 urllib2 中,HTTPHandler 中的 Connection 属性默认设置为 Close(urllib2.py 中的 L1127)。您可以使用 urlgrabber 或其他支持 HTTP/1.1 和 keep-alive 的 HTTP 处理程序。

【讨论】:

  • 非常感谢。 sn-p 工作正常。你能想到为什么服务器端有这样的要求吗?
  • 也许他们想确保每个请求都是由真实的人提交的,而不是由程序或其他东西提交的。
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2013-02-08
相关资源
最近更新 更多