urllib2.urlopen 对浏览器能打开的 URL 抛出 404 异常

0 投票
1 回答
2199 浏览
提问于 2025-04-16 03:25

下面这个网址(还有其他类似的网址)在浏览器中可以打开,但用urllib2.urlopen去访问时却会出现404错误:http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=1

geturl()返回的还是同一个网址(没有重定向)。我把从firebug复制的请求头粘贴过来试过。我还尝试把请求头作为字典传给Request,但结果还是一样。用wget在控制台可以打开这个网址,但在脚本中却不行。

代码:

source_url = 'http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=2'
try:

    socket.setdefaulttimeout(10)
    hdrs = [('Host','store.ovi.com'),('User-Agent','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US;rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13 AppEngine-Google;(+http://code.google.com/appengine)'),('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),('Accept-Language','en-us,en;q=0.5'),('Accept-Encoding','gzip,deflate'),('Accept-Charset','ISO-8859-1,utf-8;q=0.7,*;q=0.7'),('Keep-Alive','115'),('Connection','keep-alive'),('Cookie','JNPRSESSID=4u4devdrt7eb6e0qem3gin47i2; s_cc=true; undefined_s=First%20Visit; s_nr=1282817443274; s_sq=%5B%5BB%5D%5D; view=Grid; menu=menuOpen; OVI_DEVICE=b5130'),('Cache-Control','max-age=0')]
ree = urllib2.Request(source_url)
    ree.addheaders = hdrs
    opener = urllib2.build_opener()
    htmlSource = opener.open(ree).read()

except urllib2.HTTPError, e:

    print e.code  
    print e.msg
    print e.headers

错误输出:
404
未找到
日期:2010年8月28日 00:36:57 GMT
服务器:Apache/2.2.3 (Red Hat)
X-Powered-By:PHP/5.2.2
过期时间:1981年11月19日 08:52:00 GMT
缓存控制:不缓存,不存储,必须重新验证,后检查=0,前检查=0
Pragma:不缓存
保持连接:超时7秒,最大333
连接:保持连接
传输编码:分块传输
内容类型:text/html; charset=UTF-8

我到底做错了什么吗?这是个bug吗?如果是的话,有解决办法吗?谢谢!

1 个回答

3

给定一个像这样的链接:

http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=2

浏览器获取的部分其实就是:

http://store.ovi.com/

在这个链接右边的部分被称为“片段标识符”,这个部分根本不会传给服务器(显然,如果你尝试这样做,服务器会搞混)。相反,返回的HTML内容会包含一堆JavaScript,这些JavaScript会在用户的电脑上读取#...后面的数据,并通过一些XMLHttpRequest来填充页面内容。

像这样实现的网页应用抓取起来非常麻烦,因为你不能仅仅获取主页面的HTML内容。你要么得分析脚本,找出它实际获取数据的地方,要么就得连接一个真实的浏览器,执行所有的脚本,看看最终得到的文档对象是什么。这样的网页通常在可访问性和搜索引擎优化(SEO)方面也表现不佳。

幸运的是,这个网站似乎在片段中放了一些有效的路径。所以看起来你可以通过这个链接获取动态页面的数据:

http://store.ovi.com/applications?categoryId=20&fragment=1&page=1

撰写回答