Запрос 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 результатов.

Другие вопросы по тегам