Python请求二进制内容

时间:2017-06-14 09:59:57

标签: python json binary python-requests

我正在尝试从Google趋势网址获取JSON,但我无法将其转换为JSON,因为内容为b''。我怎么能把这个结果作为JSON?

我的简单代码:

import requests
r = requests.get('https://trends.google.ru/trends/api/stories/latest?hl=ru&tz=-180&cat=all&fi=15&fs=15&geo=RU&ri=300&rs=15&sort=0')
print(r.content)

r.content以:

开头
  

B ')]} \' \ N { “featuredStoryIds”:[], “trendingStoryIds”:[ “RU_lnk_iJ8H1AAwAACP-M_ru”, “RU_lnk_7H7L0wAwAAAnHM_ru”, “RU_lnk_Q-IB1AAwAABChM_ru”, “RU_lnk_EErj0wAwAADzKM_ru”, “RU_lnk_VY2s0wAwAAD57M_ru”,” RU_lnk_sdUP1AAwAAC-sM_ru “ ”RU_lnk_ILv60wAwAADa2M_ru“, ”RU_lnk_O6j70wAwAADAyM_ru“, ”RU_lnk_fVQS1AAwAABvMM_ru“, ”RU_lnk_TJ8D1AAwAABP-M_ru“, ”RU_lnk_I97F0wAwAADmvM_ru“, ”RU_lnk_tCrq0wAwAABeSM_ru“, ”RU_lnk_W8EA1AAwAABbpM_ru“, ”RU_lnk_IYX90wAwAADc5M_ru“, ”RU_lnk_bz4M1AAwAABjWM_ru“,” RU_lnk_EJ -... < / p>

使用r.json()方法对此进行解码失败:

simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

2 个答案:

答案 0 :(得分:2)

您正在与Google服务联系,Google正在为JSON添加一些额外数据prevent JSON hijacking

>>> import requests
>>> r = requests.get('https://trends.google.ru/trends/api/stories/latest?hl=ru&tz=-180&cat=all&fi=15&fs=15&geo=RU&ri=300&rs=15&sort=0')
>>> r.content[:10]
b')]}\'\n{"fea'

请注意开头的)]}'和换行符。

您需要先删除此额外数据并手动解码;有效负载中没有其他换行符,因此我们可以在换行符上拆分:

import json

json_body = r.text.splitlines()[-1]
json_data = json.loads(json_body)

我在这里使用Response.text来获取解码后的字符串数据(服务器在标题中设置正确的内容类型编码)。

这为您提供了解码字典:

>>> json_body = r.text.splitlines()[-1]
>>> json_data = json.loads(json_body)
>>> type(json_data)
<class 'dict'>
>>> sorted(json_data)
['date', 'featuredStoryIds', 'hideAllImages', 'storySummaries', 'trendingStoryIds']

答案 1 :(得分:-1)

也许试试这可能会有所帮助:

 import requests
    r = requests.get('https://trends.google.ru/trends/api/stories/latest?hl=ru&tz=-180&cat=all&fi=15&fs=15&geo=RU&ri=300&rs=15&sort=0')
    page=r.status_code
    print page