如何使用Python脚本从请求库中获取URL中的json数据?

时间:2014-04-26 16:54:33

标签: python json parsing ubuntu python-requests

我有一个URL,如果我在浏览器上点击它,它会给我下面的JSON字符串 -

以下是我的网址,假设它是URL-A,我有三个网址 -

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

以下是我的JSON字符串 -

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

现在我编写了一个Python脚本,它扫描我的所有3个URL,然后再解析JSON String以从中提取dataCount的值。并且应该每隔几秒钟继续运行以扫描URL,然后解析它。

以下是我的网址

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之外我有什么方法可以使用除{{1}}之外的其他库来重写上述脚本,这只是从服务器获取数据的部分,我们可以使用其他库吗?

因为我猜,我无法更新此软件包,因为它是我们的生产ubuntu服务器所以我需要找到其他方法来实现这一点。

1 个答案:

答案 0 :(得分: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