如何使用Python脚本从URL获取JSON数据,而不使用requests库?
我有一个网址,如果我在浏览器里打开它,就会得到下面的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