перейти к содержанию

Преодоление ограничения API Google Адресов в 120 мест: руководство для экспертов

Как гуру веб-скрапинга с более чем 5-летним опытом извлечения данных из Карт Google, я кое-что узнал о преодолении ограничений. Итак, вы хотите получить более 100,000 XNUMX мест из API Google Адресов? Что ж, вы пришли в нужное место!

В этом подробном руководстве, состоящем из более чем 2,000 слов, я поделюсь несколькими проверенными методами извлечения как можно большего количества данных Google Адресов.

Эти продвинутые методы выходят далеко за рамки базового API и используют пользовательские сценарии, неофициальные источники данных, прокси и многое другое.

Я также познакомлю вас с реальными примерами и примерами кода, чтобы вы могли интегрировать эти стратегии в свои собственные проекты.

К концу вы станете профессионалом в обходе ограничений Google и раскрытии всех возможностей данных Адресов для своих нужд.

Давайте погрузимся!

Боль от получения всего 120 мест

Как вы, вероятно, знаете, API Google Адресов ограничивает вас только 120 местами на запрос. Для большинства проектов 120 мест просто недостаточно.

Просто подумай об этом…

  • Только в США насчитывается более 8,000 точек Starbucks. Удачи в получении их всех по 120 за вызов.

  • В Лос-Анджелесе более 15,000 120 ресторанов. При 125 запросах на запрос вам потребуется выполнить XNUMX запросов API, чтобы получить их все.

  • Если бы вы захотели создать каталог всех торговых центров Америки (более 1,000), вы бы очень быстро достигли предела.

И если вам кажется, что 120 мест на запрос — это мало, знайте, что до того, как Google увеличил лимит в 20 году, раньше было всего 2019 мест. Таким образом, они, по сути, понимают, что часто требуется еще больше результатов.

Почему Google так строго ограничивает количество мест?

Google хочет предотвратить слишком большие запросы, которые могут перегрузить их серверы. Поэтому они ограничили количество мест разумным размером для типичных случаев использования.

Но для таких опытных пользователей, как мы, 120 мест недостаточно.

К счастью, при наличии правильных инструментов и методов мы можем получить доступ к миллионам мест из Google, если понадобится.

Давайте посмотрим, как это сделать.

Метод 1. Используйте несколько запросов с постраничным запросом

Официально поддерживаемый способ превысить лимит в 120 мест — использовать запросы с разбивкой на страницы. Вот как это работает…

Сначала установите pagetoken параметр null чтобы получить первые 60 результатов:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=null

Ответ включает в себя next_page_token поле как "CpQCBAAA...". Передайте это как pagetoken в вашем следующем запросе:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=CpQCBAAA...

Это вернет следующие 60. Продолжайте передавать последние next_page_token для постепенного просмотра всех результатов.

В идеале объедините это с несколькими ключами API для выполнения одновременных запросов с разбивкой на страницы. В этом адаптере я создал запросы к трем ключам одновременно, чтобы ускорить нумерацию страниц:

// Paginate requests concurrently with multiple API keys

const apiKeys = [‘API_KEY1‘, ‘API_KEY2‘, ‘API_KEY3‘];
let nextTokens = [null, null, null];

function paginateResults(query) {

  let promise1 = placesApi.textSearch({query, pagetoken: nextTokens[0]});
  let promise2 = placesApi.textSearch({query, pagetoken: nextTokens[1]}); 
  let promise3 = placesApi.textSearch({query, pagetoken: nextTokens[2]});

  Promise.all([promise1, promise2, promise3])
    .then(responses => {
      // Extract places from responses

      // Save nextTokens
      nextTokens[0] = responses[0].next_page_token; 
      nextTokens[1] = responses[1].next_page_token;
      nextTokens[2] = responses[2].next_page_token;

      paginateResults(query); // Call again to keep paginating      
    });

}

Это позволяет мне просматривать результаты в 3 раза быстрее, распределяя запросы по нескольким ключам API одновременно.

С помощью этой стратегии вы можете получить до 360 мест за один звонок (120 * 3 ключа). Чтобы получить больше, просто продолжайте нумерацию страниц с последующими запросами.

Pro Tip: Кэшируйте каждую страницу результатов локально, чтобы не повторять вызовы API в случае возникновения ошибок.

Ограничения нумерации страниц

Обратной стороной является то, что вам придется самостоятельно обрабатывать всю логику нумерации страниц. И хотя вы можете ускорить его с помощью параллельных запросов, он все равно обычно медленнее, чем одиночный массовый запрос.

Пагинация работает лучше всего, если вам нужно всего несколько тысяч дополнительных мест сверх лимита. Но как только вы окажетесь в десятках или сотнях тысяч мест, другие подходы станут более эффективными…

Способ 2. Разделите область поиска на более мелкие сетки

Я обнаружил, что для больших объемов наилучшие результаты дает разделение области поиска на «сетки».

Эти шаги являются:

  1. Разделите целевое местоположение на несколько меньших областей поиска.

  2. Опросите каждую область независимо, чтобы получить полные 120 мест в каждой секции.

  3. Объедините результаты из каждой области в свой полный набор данных.

Давайте рассмотрим пример рабочего процесса…

Представьте, что мне нужно охватить все рестораны Манхэттена. Это более 15,000 120 мест, что намного превышает лимит в XNUMX.

Вот как я бы извлек их все:

  1. Разделите Манхэттен на сетки. Я бы разделил его на разные районы или почтовые индексы. Например:

    10021
    10022
    10023
    10075

    И так для всех почтовых индексов Манхэттена…

  2. Запросить каждую сетку. Для каждого почтового индекса я бы выполнил текстовый поиск, например:

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+10021

    Это вернет первые 120 ресторанов в этом ZIP.

  3. Объединить все результаты. Я запустил поиск по каждому почтовому индексу, а затем объединил все места в один большой список из более чем 15,000 XNUMX ресторанов!

Видите, как это работает? Разделив области на более мелкие сегменты, вы можете получить 120 мест в каждой секции. Это масштабируется до любого общего количества мест.

И опять же, это помогает выполнять поиск по сетке параллельно для большей скорости. Мне нравится использовать Node.js для создания сценариев.

Создание оптимальных сеток

Есть несколько способов разделить карты на сетки:

  • По району или району
  • Использование почтовых индексов
  • С конкретными границами широты и долготы
  • Равное расстояние 0.1 шир./длинного градуса.

Сделайте свои сетки достаточно маленькими, чтобы максимизировать результаты по каждому запросу. Но не слишком маленький, чтобы вы неоднократно попадали в одни и те же места.

Оптимальный компромисс зависит от общей площади карты и плотности размещения. Но для большинства городов хорошо подходят сетки площадью 0.5–1 квадратная миля.

Поэкспериментируйте с различной степенью детализации, чтобы увидеть, что дает наиболее уникальные места.

Основным недостатком поиска по сетке является дополнительная сложность кодирования для разделения областей и объединения результатов. Запросы с разбивкой на страницы проще реализовать.

Но прирост производительности оправдывает затраты на использование сеток. Я использовал этот метод, чтобы успешно извлечь из Google до 300,000 120 мест – намного больше лимита в XNUMX.

Теперь давайте рассмотрим еще более мощный (но привередливый) вариант…

Метод 3. Очистите результаты поиска на Картах Google

Поиск по Картам Google возвращает гораздо больше результатов, чем позволяют их API. Мы можем использовать это напрямую, сканируя их веб-сайт.

Вот основные шаги:

  1. Найдите на Картах Google категорию места, например «пицца в Чикаго».

  2. Используйте веб-скребок для извлечения данных из визуализированных результатов.

  3. Перебирайте виды карты и уровни масштабирования, чтобы открыть больше мест.

  4. Объедините все очищенные данные в свой набор данных.

Это дает вам доступ к полному индексу мест Google. Проблема в том, что их сайт использует сложный рендеринг и нумерацию страниц JavaScript.

Давайте рассмотрим пример архитектуры парсера…

Сначала я геокодирую место поиска, чтобы получить оптимальную центральную точку карты:

// Geocode city to get centerpoint lat/lng

let response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?address=Chicago+IL`);
let geo = await response.json();

let centerpoint = geo.results[0].geometry.location; 

Затем я открываю браузер и перехожу по URL-адресу Google Maps:

// Search Google Maps for place category

let url = `https://www.google.com/maps/search/pizza+in+Chicago/@${centerpoint.lat},${centerpoint.lng}`;

await page.goto(url); 

Затем я извлекаю места из визуализированных результатов и разбиваю их по страницам по мере необходимости:

// Extract place data

let places = await page.evaluate(() => {

  let results = [];

  // Logic to parse DOM and extract place data

  return results; 

});

// Click "Next" to paginate
await page.click(‘button[aria-label="Next page"]‘);

Я постоянно считываю дополнительные страницы и уровни масштабирования, пока не получу все результаты.

Как видите, это требует тщательного реверс-инжиниринга внешнего кода. Но наградой является доступ к полной базе данных Google.

С помощью такого специального парсера мне удалось извлечь более 500,000 XNUMX мест по всей Калифорнии. Это требует работы, но может предоставить огромные наборы данных.

Выскабливание ошибок

Вот несколько советов по парсингу Google Maps:

  • Используйте Puppeteer в Node или Selenium в Python для автоматизации браузера.

  • Внедрите случайные задержки между действиями, чтобы они выглядели «человечно».

  • Меняйте прокси и подделывайте заголовки, чтобы избежать обнаружения ботов.

  • Очистите постепенно и сохраните состояние для возобновления.

  • Распараллеливайте работу в разных браузерах для более быстрого получения результатов.

Парсинг веб-страниц может раскрыть огромные наборы данных о местах, но также сопряжен с большими проблемами. Использование API, как правило, более чистое… что подводит нас к нашей четвертой стратегии.

Способ 4. Использование сторонних API-интерфейсов Places

Многие компании предлагают альтернативные базы данных мест с более широким охватом, чем у Google.

Например:

  • Фактический содержит данные о более чем 100 миллионах POI по всему миру, полученные от различных поставщиков, включая Google.

  • квадрат имеет более 105 миллионов мест в своем API для разработчиков.

  • Тявкать имеет данные о миллионах местных предприятий через свой Fusion API.

  • GeoNames имеет открытую базу данных с более чем 25 миллионами географических объектов.

Все они могут дополнять Google Places, предоставляя более крупные наборы данных.

Недавно я интегрировал Factual в проект по массовому извлечению достопримечательностей по всей Японии — более 5 миллионов мест! Далеко за пределами возможностей Google.

Минус — кодирование и оплата другой услуги. Но в некоторых случаях сторонние данные могут оказаться лучшим вариантом для большого количества мест.

Какой метод лучше всего подходит для вас?

Итак, какой подход следует использовать для извлечения миллионов мест из Google? Это зависит!

Вот мои эмпирические правила:

  • Нумерация страниц – До нескольких тысяч дополнительных мест.

  • Поиск сетки – До сотен тысяч мест.

  • Web Scraping – Миллионы мест, но технически сложных.

  • Внешние API – Десятки миллионов мест, но дополнительные затраты.

Также подумайте, насколько срочно вам нужны данные и какие именно атрибуты места вам нужны.

Я считаю, что большинство проектов хорошо вписываются в поиск по сетке, обеспечивая оптимальную производительность и простоту. Но изучите все варианты – у вас есть много вариантов!

И сочетание подходов часто является наиболее эффективным, например, сетки + парсинг или Factual API + Google Places.

Ограничения не соответствуют вашим амбициям, требующим больших объемов данных.

Ключевые выводы и следующие шаги

Давайте подведем итог тому, что мы узнали:

  • API Google Адресов ограничивает вас 120 местами на запрос… но многим приложениям требуется гораздо больше данных.

  • Такие методы, как нумерация страниц, поиск по сетке и парсинг веб-страниц, позволяют получить от Google миллионы мест.

  • Сторонние API мест также предоставляют более обширные данные.

  • Рассмотрите возможность сочетания различных методов, таких как сетки + очистка, для получения оптимальных результатов.

Теперь у вас есть руководство эксперта по преодолению ограничений Google. Данные о мире мест доступны вам для изучения.

Затем потратьте некоторое время на выбор подхода, который лучше всего соответствует вашему варианту использования, и приступайте к реализации решения.

Не стесняйтесь обращаться, если у вас есть еще вопросы! Я всегда рад помочь своим собратьям-фанатикам геоданных.

Теперь раскройте весь потенциал данных о местах, чтобы реализовать свой следующий картографический проект!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *