【问题标题】:Problems getting JSON with urllib.URLopener使用 urllib.URLopener 获取 JSON 的问题
【发布时间】:2016-02-27 11:05:27
【问题描述】:

我在使用urllib.URLopener 获取 JSON 时遇到问题,即使我可以在导航器中看到它。

代码:

import urllib
import json
json_obj = urllib.URLopener()
json_obj.retrieve(json_adress, self.home + "/.cache/program/file.json")

错误:

('http error', 404, 'Not Found', <httplib.HTTPMessage instance at 0x7fa73d9b3a28>)

5 分钟后我可以得到它,但是另一个地址失败了。发生了什么?

例如JSON文件的URL是:

http://webservices.francetelevisions.fr/tools/getInfosOeuvre/v2/?idDiffusion=135842229&catalogue=Pluzz&callback=webserviceCallback_135842229

【问题讨论】:

  • 我们不知道。那是服务器告诉你它没有找到,而不是 Python。也许该站点使用 CDN 并且并非所有机器都已更新?如果没有 URL 的详细信息,我们将无能为力。
  • 好的,谢谢。我将通过编辑问题添加 json 地址

标签: python json python-2.7 urllib


【解决方案1】:

您尝试访问的 URL 托管在 CDN 上,并非所有服务器似乎都有您请求的内容:

$ host webservices.francetelevisions.fr
webservices.francetelevisions.fr is an alias for www-es.francetelevisions.fr.
www-es.francetelevisions.fr is an alias for francetv.fr.edgesuite.net.
francetv.fr.edgesuite.net is an alias for a253.w5.akamai.net.
a253.w5.akamai.net has address 23.3.13.170
a253.w5.akamai.net has address 23.3.13.176

查找主机名时为您的计算机提供的确切地址取决于您的地理位置;通过解析 DNS 别名,DNS 服务器使用您的 IP 地址来猜测网络中可能离您更近的服务器。

很可能是更新逐渐推出到 CDN 机器,或者在第一次 DNS 查找过期后,您获得了一个不同的 IP 地址以便稍后联系。无论哪种方式,您都无法从 Python 中对此做些什么。除非您知道源服务器(通常网站披露以避免过载),否则您必须使用正常的 CDN 更新流程。

【讨论】:

  • 好的,感谢这些精确度。我将添加一个try/except,并在我的程序中添加一条消息“稍后再试!” :)
【解决方案2】:

我终于通过在 fork Firefox 中添加标头找到了解决方案:

json_obj = urllib.URLopener()
json_obj.addheaders = [("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:44.0) Gecko/20100101 Firefox/44.0")]
json_obj.retrieve(json_adress, self.home + "/.cache/program/file.json")

现在它每次都有效!

【讨论】:

  • 很可能 CDN 当前是最新的。 CDN 更新不是连续的。
  • 即使用户代理标头有所不同,这也表明某些 CDN 端点配置不同。而且您仍然会不时遇到推出问题。
猜你喜欢
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多