使用urllib.URLopener

时间:2016-02-27 11:05:27

标签: python json python-2.7 urllib

即使我在导航器中看到JSON,我也无法使用urllib.URLopener获取JSON。

CODE:

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

2 个答案:

答案 0 :(得分:0)

您尝试访问的网址托管在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更新流程。

答案 1 :(得分:0)

我最终通过在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")

现在每次都有效!