使用urllib2检查响应

时间:2013-12-16 20:32:29

标签: python json api opencore

我正在尝试使用opencorporates api递增页面计数器来访问页面。但问题是有时会出现无用的数据。例如,在下面的辖区管辖区号= ae_az的网址中,我得到的网页显示为:

{"api_version":"0.2","results":{"companies":[],"page":1,"per_page":26,"total_pages":0,"total_count":0}}

技术上是空的。如何检查这些数据并跳过这个以继续前往下一个辖区?

这是我的代码

import urllib2
import json,os

f = open('codes','r')
for line in f.readlines():
   id = line.strip('\n')
   url = 'http://api.opencorporates.com/v0.2/companies/search?q=&jurisdiction_code={0}&per_page=26&current_status=Active&page={1}?api_token=ab123cd45' 
   i = 0
   directory = id
   os.makedirs(directory)
   while True:
      i += 1
      req = urllib2.Request(url.format(id, i))
      print url.format(id,i)
      try:
        response = urllib2.urlopen(url.format(id, i))
      except urllib2.HTTPError, e:
        break
      content = response.read()
      fo = str(i) + '.json'    
      OUTFILE = os.path.join(directory, fo)
      with open(OUTFILE, 'w') as f:
        f.write(content)

2 个答案:

答案 0 :(得分:2)

解释你得到的回复(你已经知道它是json)并检查你想要的数据是否存在。

...
content = response.read()
data = json.loads(content)
if not data.get('results', {}).get('companies'):
    break
...

这是您使用请求编写的代码并使用此处的答案。它远没有它应该的那么强大或干净,但展示了你可能想要采取的道路。速率限制是猜测,似乎不起作用。请记住将实际的API密钥放入。

import json
import os
from time import sleep
import requests

url = 'http://api.opencorporates.com/v0.2/companies/search'
token = 'ab123cd45'
rate = 20  # seconds to wait after rate limited

with open('codes') as f:
    codes = [l.strip('\n') for l in f]


def get_page(code, page, **kwargs):
    params = {
        # 'api_token': token,
        'jurisdiction_code': code,
        'page': page,
    }
    params.update(kwargs)

    while True:
        r = requests.get(url, params=params)

        try:
            data = r.json()
        except ValueError:
            return None

        if 'error' in data:
            print data['error']['message']
            sleep(rate)
            continue

        return data['results']


def dump_page(code, page, data):
    with open(os.path.join(code, str(page) + '.json'), 'w') as f:
        json.dump(data, f)


for code in codes:
    try:
        os.makedirs(code)
    except os.error:
        pass

    data = get_page(code, 1)
    if data is None:
        continue

    dump_page(code, 1, data['companies'])

    for page in xrange(1, int(data.get('total_pages', 1))):
        data = get_page(code, page)
        if data is None:
            break

        dump_page(code, page, data['companies'])

答案 1 :(得分:0)

我认为实际上这个例子是而不是“技术上是空的”。它包含数据,因此在技术上不是空的。数据不包括任何对您有用的字段。 : - )

如果您希望代码跳过具有无趣数据的响应,那么只需在写入任何数据之前检查JSON是否具有必要的字段:

content = response.read()
try:
    json_content = json.loads(content)
    if json_content['results']['total_count'] > 0:
        fo = str(i) + '.json'    
        OUTFILE = os.path.join(directory, fo)
        with open(OUTFILE, 'w') as f:
            f.write(content)
except KeyError:
    break
except ValueError:
    break

等。您可能想要报告ValueError或KeyError,但这取决于您。