从网站下载Json数据

时间:2018-05-18 23:38:30

标签: python json

我正在尝试编写一个python脚本,它将一次获取一堆url并获取该url的响应内容并将其存储为json文件。

以下是我最初为了获取网址

的回复而写的内容
def download_json()

    params={'id':00163E0BD0C1FA89,
            'list':'141',
            'queue': 'gen',
            'type': 'abc_stat'
           }



    req_obj= requests.get(link, params=params)
    print(req_obj.url)
    print(req_obj.status_code)

    return req_obj

它创建了正确的URL,因为当我直接在浏览器中复制url时,它以json格式显示输出。这是我在浏览器上看到的一行json输出:

{
  "DATA" : [
    {
      "SCHEMA" : "abc_4_QAATu2.",
      "ID" : "QAATu2",
      "IM_ID" : "22faba86_c9e0_4dbc",
      "S_NUMBER" : "502379284",
      "CONFIG_TYPE" : "las_home_type",
      "CONFIG_KEY" : "las_home_key",
      "CONFIG_LONG_V" : "1",
      "CONFIG_STRING_V" : "https://abc-deg/development",
      "MODIFIED_DATE" : "Unknown"
    },

所以这确实表明当我直接在浏览器中输入url时,数据以json格式返回。

但是我的请求对象有标题:

缺货[26]:

{'content-length': '15457', 'expires': '0', 'content-encoding': 'gzip', 'cache-control': 'no-cache, no-store, private', 'set-cookie': 'login-XSRF_RZA=2018051-axJnifQUpOnrS8WCFI; path=/abc/deo/cpo; secure; HttpOnly, usercontext=client=002; path=/', 'content-type': 'text/html; charset=utf-8', 'pragma': 'no-cache, no-store, private'}

现在当我执行requests.json()来获取json python对象中的数据时,我收到以下错误

JSONDecodeError                           Traceback (most recent call last)
<ipython-input-28-4cfc1a694fcf> in <module>()
----> 1 req_obj.json()

/Users/anaconda/envs/dl/lib/python3.5/site-packages/requests/models.py in json(self, **kwargs)
    890                     # used.
    891                     pass
--> 892         return complexjson.loads(self.text, **kwargs)
    893 
    894     @property

/Users/anaconda/envs/dl/lib/python3.5/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    317             parse_int is None and parse_float is None and
    318             parse_constant is None and object_pairs_hook is None and not kw):
--> 319         return _default_decoder.decode(s)
    320     if cls is None:
    321         cls = JSONDecoder

/Users/anaconda/envs/dl/lib/python3.5/json/decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

/Users/anaconda/envs/dl/lib/python3.5/json/decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 2 column 1 (char 2)

编辑:

如果你在上面标题中看到的content_type显示为html,即使在浏览器上它显示json作为输出

但是当我这样做时

req_obj.json 

<bound method Response.json of <Response [200]>>

但是req_obj.json()给出了以下错误。

知道为什么当输出实际上是json格式时,它无法将数据转换为json格式,如上所示?感谢

2 个答案:

答案 0 :(得分:0)

根据documentation

  

如果JSON解码失败,r.json()会引发异常。对于   例如,如果响应获得204(无内容),或者响应   包含无效的JSON,尝试r.json()引发ValueError: No JSON object could be decoded.

虽然它没有抛出相同的错误消息,但原因似乎是相同的:您可能没有将JSON作为答案,这可以解释为什么JSONDecode抛出异常

您应该可以通过打印req_obj.text而不是使用req_obj.json()来确认这一点。

至于如何修复它,我怀疑使用浏览器的请求和使用Python的请求(例如不同的参数)之间必然存在不同之处。

我建议您阅读this以进一步调查问题的根源。

答案 1 :(得分:0)

根据这份文件:http://docs.python-requests.org/en/master/

您可以查看componentWillMountreq_obj.status_code。如果status_code为200且内容类型为r.headers['content-type'],则您可以尝试检查'application/json; charset=utf8'