如何使用Python脚本从URL获取JSON数据,而不使用requests库?

0 投票
1 回答
1325 浏览
提问于 2025-04-18 04:23

我有一个网址,如果我在浏览器里打开它,就会得到下面的JSON字符串。

这个网址我们叫它 URL-A,我大概有三个这样的网址。

http://hostnameA:1234/Service/statistics?%24format=json

下面是我的JSON字符串:

{
 "description": "",
 "statistics": {
  "dataCount": 0,
 }
}

现在我写了一个Python脚本,它会扫描我这三个网址,然后解析JSON字符串,提取出里面的 dataCount 的值。这个脚本应该每隔几秒就运行一次,去扫描网址并解析数据。

以下是我的网址:

hostnameA       http://hostnameA:1234/Service/statistics?%24format=json
hostnameB       http://hostnameB:1234/Service/statistics?%24format=json
hostnameC       http://hostnameC:1234/Service/statistics?%24format=json

我希望在控制台上看到的数据是这样的,这里的 dataCount 会是实际的数字:

hostnameA - dataCount
hostnameB - dataCount
hostnameC - dataCount

我有下面这个Python脚本,在我的Cygwin上运行得很好,但如果我在公司的生产环境的Ubuntu机器上运行,就会出错:

import requests
from time import sleep

def get_data_count(url):
    try:
        req = requests.get(url)
    except requests.ConnectionError:
        return 'could not get page'

    try:
        # this line is giving an error
        return int(req.json['statistics']['dataCount'])
    except TypeError:
        return 'field not found'
    except ValueError:
        return 'not an integer'

def main():
    urls = [
        ('hostnameA', 'http://hostnameA:1234/Service/statistics?%24format=json'),
        ('hostnameB', 'http://hostnameB:1234/Service/statistics?%24format=json'),
        ('hostnameC', 'http://hostnameC:1234/Service/statistics?%24format=json')
    ]

    while True:
        print('')
        for name, url in urls:
            res = get_data_count(url)
            print('{name} - {res}'.format(name=name, res=res))
        sleep(10.)

if __name__=="__main__":
    main()

这是我遇到的错误:

AttributeError: 'Response' object has no attribute 'json'

我使用的是Python 2.7.3和Ubuntu 12.04,运行的 requests 版本是 0.8.2(我觉得这可能是问题所在)。

无论如何,有没有办法用其他库重写上面的脚本,除了 requests,也就是说,仅仅是获取服务器数据的部分,我们可以用其他库吗?

因为我想,我不能更新这个包,因为这是我们的生产环境的Ubuntu服务器,所以我需要找到其他的方法来解决这个问题。

1 个回答

2

你仍然可以使用 requests 库,只是不要依赖它的响应对象来帮你解码:

import json

# ...
data = json.loads(req.content)
return int(data['statistics']['dataCount'])

版本 0.8.2 已经很老了;你可以使用 virtualenv 来创建一个地方,方便你安装一个更新的版本:

$ virtualenv venv
New python executable in venv/bin/python2.7
Also creating executable in venv/bin/python
Installing Setuptools..............................................................................................................................................................................................................................done.
Installing Pip.....................................................................................................................................................................................................................................................................................................................................done.
$ cd venv/
$ bin/pip install requests
Downloading/unpacking requests
  Downloading requests-2.2.1.tar.gz (421kB): 421kB downloaded
  Running setup.py egg_info for package requests

Installing collected packages: requests
  Running setup.py install for requests

Successfully installed requests
Cleaning up...
$ bin/python -c 'import requests; print requests.__version__'
2.2.1

撰写回答