【问题标题】:urllib2.urlopen throws 404 exception for urls that browser opensurllib2.urlopen 为浏览器打开的 url 抛出 404 异常
【发布时间】:2010-08-28 00:54:13
【问题描述】:

以下网址(以及其他类似网址)可以在浏览器中打开,但会导致 urllib2.urlopen 抛出 404 异常:http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=1

geturl() 返回相同的 url(无重定向)。标题是从 firebug 复制和粘贴的。我尝试将标题作为字典传递给请求,但得到了相同的结果。 wget 在控制台中打开 url,但不是从脚本中打开。

代码:

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

    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()

除了urllib2.HTTPError,e:

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

错误输出:
404
未找到
日期:2010 年 8 月 28 日星期六 00:36:57 GMT
服务器:Apache/2.2.3(红帽)
X-Powered-By:PHP/5.2.2
过期:1981 年 11 月 19 日星期四 08:52:00 GMT
缓存控制:无存储、无缓存、必须重新验证、后检查=0、预检查=0
编译指示:无缓存
保持活动状态:超时=7,最大值=333
连接:保持活动
传输编码:分块
内容类型:文本/html;字符集=UTF-8

如果有的话,我做错了什么?这是一个错误吗?如果是这样,是否有解决方法?谢谢!

【问题讨论】:

  • 网址中的片段似乎搞砸了

标签: python http exception debugging urllib2


【解决方案1】:

给定一个 URL,例如:

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

浏览器获取的只是:

http://store.ovi.com/

右侧的所有内容都是“片段标识符”,根本不会传递给服务器(显然,如果您尝试,它会混淆)。相反,/ URL 返回的 HTML 将包含一个 JavaScript 负载,它在客户端读取 #... 数据并使用一堆 XMLHttpRequests 填充页面内容。

像这样实现的 Web 应用程序是一个很大的老问题,因为您不能只获取主页的 HTML 内容。相反,您必须分析脚本以找出它从何处获取实际数据,或者您必须连接一个真正的浏览器才能执行所有脚本并查看剩下的文档对象。它们通常也不利于可访问性和 SEO。

幸运的是,这个网站似乎在片段中放入了一些东西,这也是一条有效的路径。所以看起来你可以从 URL 中获取动态页面数据:

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

【讨论】:

  • 感谢您的回答。从控制台使用 wget() 打开 url 没有问题。为什么 wget 似乎成功传递了片段标识符,而 urlib2 却没有?谢谢。
  • wget 不传递片段标识符,它在使用它之前将其从 URL 中截断。如果urllib2 不这样做,这就是一个错误。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2012-08-31
  • 2017-01-01
相关资源
最近更新 更多