2014-02-04 4 views
-1

У меня есть URL-адрес, который дает мне ниже JSON строки, если я ударил их в браузере -Как разобрать JSON, исходящий из всех URL-адресов, используя Python?

Ниже мой URL, скажем, это URL-A

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

А ниже мой JSON String -

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

Так как выше URL-A, у меня есть около 5 URLs, который также дает мне тот же JSON строку назад, но это может быть возможно, что dataCount счетчик не равен нулю в них.

Теперь, что я должен сделать, мне нужно написать скрипт Python, который может сканировать все 5 URL-адресов, а затем проанализировать JSON String, чтобы извлечь из него dataCount и его счет. И он должен продолжать работать каждые несколько секунд, чтобы проверить URL-адрес, а затем проанализировать его.

Ниже

URL-A  http://hostnameA:1234/Service/statistics?%24format=json 
URL-B  http://hostnameB:1234/Service/statistics?%24format=json 
URL-C  http://hostnameC:1234/Service/statistics?%24format=json 
URL-D  http://hostnameD:1234/Service/statistics?%24format=json 
URL-E  http://hostnameE:1234/Service/statistics?%24format=json 

И данные, которые я хочу видеть, как это на консоли, здесь будет dataCount фактическое число моего URL в

hostnameA - dataCount 
hostnameB - dataCount 
hostnameC - dataCount 
hostnameD - dataCount 
hostnameE - dataCount 

Возможно ли это сделать в Python ?

UPDATE: -

Это то, что я пробовал -

import urllib, json 
url = "http://hostnameA:1234/Service/statistics?%24format=json" 
response = urllib.urlopen(url); 
data = json.loads(response.read()) 
print data 

Но как сделать то же самое для другой 5 URL, и продолжать ее сканирование каждые 10 секунд, а также извлекать dataCount от него?

+0

Yup, это совершенно возможно. –

+1

Вы еще что-нибудь пробовали? Как посмотреть библиотеки 'urllib2' и' json'? ** Здесь нет необходимости использовать regex здесь, кстати. –

+0

Yup Я пробовал это, но не вставил свой ответ в вопросе. Просто обновил мой вопрос .. – AKIWEB

ответ

1
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: 
     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'), 
     ('hostnameA', 'http://hostnameB:1234/Service/statistics?%24format=json'), 
     ('hostnameA', 'http://hostnameC:1234/Service/statistics?%24format=json'), 
     ('hostnameA', 'http://hostnameD:1234/Service/statistics?%24format=json'), 
     ('hostnameA', 'http://hostnameE: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() 

Edit: в ответ на AKIWEB:

Запуск Python 2.7.6 с запросами 0.13.2 на Window 7 x64:

>>> requests.get('http://echo.jsontest.com/key/value/one/two').json 
{u'key': u'value', u'one': u'two'} 

>>> requests.get('http://echo.jsontest.com/key/value/one/two').json() 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    requests.get('http://echo.jsontest.com/key/value/one/two').json() 
TypeError: 'dict' object is not callable 

Да, я довольно уверен.

+0

Вы пропустили фигурные скобки рядом с 'json' в' req.json', я думаю. – AKIWEB

+0

@AKIWEB: на самом деле нет; json - это свойство, а не метод, поэтому он работает правильно, как есть. –

+0

Вы уверены? Для меня это не работает, если я запускаю это как есть, я всегда получаю поле не найденным. Но если я заменил этот 'req.json ['statistics'] ['dataCount']' на 'req.json() [' статистика '] [' dataCount '] 'тогда он начинает работать. – AKIWEB

Смежные вопросы