urllib2加载移动网站时的问题

4 投票
1 回答
721 浏览
提问于 2025-04-16 17:58

我正在尝试从 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()

看起来他们的服务器对几个请求的变量进行了验证。经过多次测试,这里有一些结论:

  1. HTTP协议必须是HTTP/1.1。
  2. 如果请求头中有Connection属性,它的值应该是keep-alive。
  3. 请求头中必须有User-Agent属性,值可以随便。

在urllib2中,HTTPHandler里的Connection属性默认设置为Close(在urllib2.py的第1127行)。你可以使用urlgrabber或者其他支持HTTP/1.1和keep-alive的HTTP处理器。

撰写回答