urllib2加载移动网站时的问题
我正在尝试从 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>
如果我用浏览器打开这个网址,一切都很正常。那么,有人能告诉我这个网站有什么特别之处,让 urllib2 无法加载这个页面吗?我猜这可能和这个网站是为手机用户设计的有关。对于“普通”网站,urllib2 工作得很好。还有其他类型的网站是基本的 urlopen(URL) 无法使用的吗?
谢谢大家的帮助
1 个回答
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()
看起来他们的服务器对几个请求的变量进行了验证。经过多次测试,这里有一些结论:
- HTTP协议必须是HTTP/1.1。
- 如果请求头中有Connection属性,它的值应该是keep-alive。
- 请求头中必须有User-Agent属性,值可以随便。
在urllib2中,HTTPHandler里的Connection属性默认设置为Close(在urllib2.py的第1127行)。你可以使用urlgrabber或者其他支持HTTP/1.1和keep-alive的HTTP处理器。