我正在做一些抓取并查看这样的页面(https://www.endomondo.com/rest/v1/users/20261627/workouts/526622897),但我无法完全检索JSON内容。我尝试过使用以下两组代码,但是每个返回一个不完整的JSON对象:
machine.config
并且类似地使用响应库而不是urllib也无法检索完整的JSON
url = 'https://www.endomondo.com/rest/v1/users/%s/workouts/%s'%(string_use_user, string_use_workout)
print(url)
response = urlopen(url)
try:
reader = codecs.getreader("utf-8")
print(reader(response))
jsonresponse = json.load(reader(response))
print(jsonresponse)
在这两种情况下,我得到大约1/4的JSON。例如,在这种情况下: https://www.endomondo.com/rest/v1/users/20261627/workouts/526622897
我收到了:
url = 'https://www.endomondo.com/rest/v1/users/%s/workouts/%s'%(string_use_user, string_use_workout)
print("using this url %s"%url)
r = requests.get(url)
try:
print(r.json())
jsonresponse = r.json()# json.loads(response.read())
我没有收到数据中的长数组。我甚至没有恢复所有的非数组数据。
我通过JSON验证器运行原始页面,没关系。同样地,我运行了通过验证器收到的JSON,它也没问题 - 除非我与原始版本进行比较,否则它不会显示任何遗漏的迹象。
我很感激有关如何排除故障的任何建议。感谢。
答案 0 :(得分:3)
看起来这个API正在做一些User-Agent sniffing,只发送它认为是实际网络浏览器的完整内容。
使用常用浏览器的UA字符串设置User-Agent
标头后,您将获得完整的响应:
>>> UA = 'Mozilla/5.0 (X11; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0'
>>> url = 'https://www.endomondo.com/rest/v1/users/20261627/workouts/526622897'
>>> r = requests.get(url, headers={'User-Agent': UA})
>>>
>>> print len(r.content)
96412
有关setting custom headers的详细信息,请参阅requests
文档。