Запрос Freebase + GoogleAPI возвращает ошибки, когда результаты запроса превышают определенное количество
Я пытаюсь запросить все округа США и их местоположение (долгота + широта) на Freebase. Я заметил, что иногда запрос будет работать, но при других попытках он возвращает следующее: <"HttpError 503 при запросе... возвратил" Backend Error ">.
Я попытался изменить пределы результата запроса, и я обнаружил, что предел, на котором разбивается мой запрос, варьируется; иногда это работает, когда "предел":2900, а иногда он возвращает вышеупомянутую ошибку при "ограничении":1200.
Вот код, который я написал до сих пор:
из itertools импорт islice из обнаружения импорта apiclient из импорта модели импорта apiclient json из CREDENTIALS import FREEBASE_KEY из pandas import DataFrame, Series DEVELOPER_KEY = FREEBASE_KEY model.JsonModel.alt_param = "" freebase = discovery.build('freebase', v1 =DEVELOPER_KEY) query_json = """ [{ "id": null, "name": null, "/location/us_county/fips_6_4_code": [], "/location/location/geolocation": { "latitude": null, "longitude": null }, "limit": 3050 }]""".replace("\n", " ") query = json.loads(query_json) response = json.loads(freebase.mqlread(query=json.dumps(query)).execute()) results = list() для результата в islice (ответ ['result'], None): results.append( {'id': result['id'], 'name': результат ['name'], 'latitude': float(результат ['/location/location/geolocation']['latitude']), 'longitude': float(result['/location/location/geolocation'][' долгота ']), 'fips': результат ['/location/us_county/fips_6_4_code'], }) states = DataFrame(результаты) plt.scatter(states["longitude"], states[" широта "])
Это не похоже на проблему с квотами, и другие отметили аналогичную проблему в списке рассылки Freebase: http://lists.freebase.com/pipermail/freebase-discuss/2011-December/007710.html December/ 007710.html Но это было для другой тип данных, поэтому кажется, что их решение не применимо к тому, над чем я работаю.
[РЕДАКТИРОВАТЬ] Я использовал курсор для перебора данных, и он отлично работает. Вот последний код, который я использовал:
из itertools импортировать остров из открытия импорта apiclient из модели импорта apiclient импорт JSON из CREDENTIALS import FREEBASE_KEY из панды импорт DataFrame, серии DEVELOPER_KEY = FREEBASE_KEY model.JsonModel.alt_param = "" freebase = discovery.build('freebase', 'v1', developerKey=DEVELOPER_KEY) запрос = [{ "id": нет, "имя": нет, "type": "/location/us_county", "/location/location/geolocation": { "широта": нет, "долгота": нет } }] результаты = [] count = 0 def do_query(cursor=""): response = json.loads(freebase.mqlread(query=json.dumps(запрос), курсор = курсор).execute ()) для результата в islice (ответ ['result'], None): results.append ({'id': result ['id'], 'имя': результат ['имя'], 'широта': результат ['/location/location/geolocation']['latitude'], 'долгота': результат ['/location/location/geolocation']['longitude'], }) return response.get("курсор") курсор = do_query() в то время как (курсор): курсор = do_query (курсор) # Проверьте, сколько итераций прошел этот цикл. # отпечаток кол + 1 = # Вставить результаты в панде DataFrame и сюжет. States = DataFrame (результаты) plt.scatter (states ["долгота"], states ["широта"])
2 ответа
Это относительно простой запрос, но, если посмотреть на него в перспективе, предел по умолчанию равен 100, что НАМНОГО ниже того, что вы просите. Я бы предложил использовать нижний предел и курсор для постраничного просмотра результатов (и подачи отчета об ошибке, потому что он должен возвращать не общую "ошибку бэкенда", а какую-то ошибку, специфичную для MQL)
Вот пример кода, который покажет вам, как перебирать результаты с помощью курсора:
cursor = ''
while cursor != False:
response = json.loads(freebase.mqlread(query=json.dumps(query), cursor=cursor).execute())
for county in response['result']:
print county['name']
cursor = response['cursor']
Просто оставь limit
предложение из вашего запроса, и он будет перебирать весь список округов в пакетах по 100 результатов.