2011-05-19 51 views
4

我试图从http://m.finnkino.fi/events/now_showing获取一些数据,但此刻我失败了,因为我甚至无法使用python加载页面源代码。 目前我使用下面的代码:urllib2加载手机网站的问题

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)不起作用?

感谢您的帮助

+0

您是否认为这可能有助于我们了解运行该代码时会发生什么?它与你期望的有什么不同?你会得到什么错误? – 2011-05-19 15:52:11

+0

我也得到一个超时。但WGET的作品。所以这不是用户代理的问题,只是尝试使用自定义urlopenener,它也不起作用。 – 2011-05-19 15:56:11

+0

恭喜,这是你发现的一个非常奇怪的问题。在python 2.7中,它会在调用'self._sock.recv'时永远挂在socket.py 447行上,该文件内置于python中,并且没有任何关联的python源代码。这比python和urllib2更深入。 – 2011-05-19 16:26:27

回答

3

以下代码段正常工作。

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 prop,它的值应该保持活动状态。
  3. 请求标头必须拥有User-Agent prop,无论其值如何。

在urllib2中,HTTPHandler中的Connection prop默认设置为Close(urllib2.py中的L1127)。您可以使用urlgrabber或其他支持HTTP/1.1并保持活动状态的HTTP处理程序。

+0

非常感谢。代码片段正常工作。你能想到为什么服务器端会有这样的需求吗? – 2011-05-20 08:53:33

+0

也许他们想要确保每个请求都是由真人提交的,而不是由程序或其他东西提交。 – silverfox 2011-05-20 09:56:29