Python3请求模块或urllib.request模块检索不完整的json

时间:2015-06-15 21:45:14

标签: python json python-requests

我正在做一些抓取并查看这样的页面(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,它也没问题 - 除非我与原始版本进行比较,否则它不会显示任何遗漏的迹象。

我很感激有关如何排除故障的任何建议。感谢。

1 个答案:

答案 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文档。