即使我在导航器中看到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
答案 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")
现在每次都有效!