我正在尝试使用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¤t_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)
答案 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,但这取决于您。