Использование Селен в скраппинге данных - довольно распространенное явление. Он автоматизирует браузеры и позволяет имитировать реальные действия пользователя, чтобы избежать блокировки. Это особенно полезно при скриптинге динамически генерируемых сайтов JavaScript, таких как Google. Более того, он помогает избежать любой защиты от краулинга, поскольку в основном имитирует поведение реальных клиентов.
В этой статье вы увидите пошаговое руководство по разработке скрепера, который сможет парсить места из Google Maps без блокировки даже после 1000+ страниц.
Что нам понадобится для создания гусеницы
- Python 3+.
- Установлен браузер Chrome.
- Selenium 3.141.0+ (пакет python).
- Драйвер Chrome (для вашей ОС).
- Parsel или любую другую библиотеку для извлечения данных из HTML, например, Beautiful Soup.
Пошаговое руководство по созданию распаковщика карт Google
Загрузите и сохраните ChromeDriver
Чтобы использовать Selenium в Google Chrome, необходимо связать код python с браузером с помощью функции ChromeDriver.
Загрузите версию ChromeDriver, соответствующую версии вашего браузера и типу ОС. Номер версии вашего браузера Chrome можно узнать здесь: Chrom -> Значок меню (правый верхний угол) -> Справка -> О Google Chrome.
Разархивируйте файл chromedriver и сохраните его где-нибудь в системе (путь к нему мы будем использовать позже). В данном учебном примере мы сохраним файл в папке проекта.
Установка пакетов Selenium и Parsel
Установите пакеты Selenium и Parsel, выполнив следующие команды. Мы будем использовать Parsel позже, когда будем разбирать содержимое HTML.
pip install selenium
pip install parsel # для извлечения данных из HTML с помощью XPath или CSS-селекторов
Инициализация и запуск Webdriver
Перед инициализацией Webdriver убедитесь, что вы выполнили предыдущие шаги и у вас есть путь к файлу chromedriver. Инициализируйте драйвер следующим кодом. Вы должны увидеть, как откроется новое окно Chrome.
from selenium import webdriver
chromedrive_path = './chromedriver' # используйте путь к драйверу, который вы скачали на предыдущих шагах
driver = webdriver.Chrome(chromedrive_path)
На mac вы можете увидеть следующее: "chromedriver не может быть открыт, потому что разработчик не может быть проверен". Чтобы решить эту проблему, щелкните хромированный драйвер в Finder, выберите Open в меню, а затем нажмите Open в появившемся диалоговом окне. В открывшемся окне терминала вы должны увидеть надпись "ChromeDriver was started successfully". Закройте его, и после этого вы сможете запускать ChromeDriver из вашего кода.
Загрузить страницу Google Maps
После запуска драйвера вы готовы открыть некоторые страницы. Чтобы открыть любую страницу, используйте команду "get".
url = 'https://www.google.com/maps/search/bars+near+NY,+USA/@40.7443439,-74.0197995,13z'
driver.get(url)
Разбор содержимого поиска по картам
После открытия страницы вы увидите в окне браузера страницу, которой управляет ваш python-код. Вы можете выполнить следующий код, чтобы получить содержимое HTML-страницы из ChromeDriver.
page_content = driver.page_source
Чтобы удобно видеть HTML-содержимое, откройте консоль разработчика в Chrome, открыв меню Chrome в правом верхнем углу окна браузера и выбрав More Tools > Developer Tools. Теперь вам должны быть видны элементы вашей страницы.

Вы можете разобрать содержимое HTML-страницы с помощью ваших любимых инструментов разбора. Мы будем использовать Parsel в этом учебнике.
from parsel import Selector
response = Selector(page_content)
Итерация по объявлениям и получение данных о каждом месте.
results = []
for el in response.xpath('//div[contains(@aria-label, "Results for")]/div/div[./a]'):
results.append({
'link': el.xpath('./a/@href').extract_first(''),
'title': el.xpath('./a/@aria-label').extract_first('')
})
print(results)
Вывод из мест Google Maps (сокращенный).
[
{
'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
'title': 'Black Iron Burger'
},
{
'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
'title': 'Fools Gold NYC'
},
{
'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
'title': '11th St. Bar'
},
...
]
Остановите драйвер после завершения процесса извлечения
Важно запускать и останавливать драйвер до и после скрапбукинга соответственно. Это аналогично тому, как вы открываете и закрываете браузер до и после работы в Интернете. Закройте драйвер, выполнив следующий код.
driver.quit()
Заключение и рекомендации по масштабированию и повышению надежности скрепера
Несмотря на сложную HTML-структуру Google Maps, с помощью Selenium и хорошего знания XPath и селекторов CSS можно добиться неплохих результатов в скрейпинге. Этот метод использования эмулятора браузера должен защитить вас от блокировки. Однако, если вы собираетесь масштабировать свое приложение, вы можете рассмотреть возможность использования прокси-серверов, чтобы избежать непредвиденных неприятностей.
Параллельная работа
Можно запускать драйверы в многопроцессорном режиме (не многопоточном), но каждый драйвер будет потреблять один процессор. Убедитесь, что у вас их достаточно.
Окончательный способ скрапирования Google Maps в масштабах предприятия
Поскольку соскабливание Google может оказаться довольно сложной задачей, многие компании и крупные предприятия хотят начать соскабливать миллионы страниц, не тратя время на разработку и обслуживание собственных краулеров.
Самый простой способ начать работу по соскабливанию Google Maps - использовать Платформа Outscraper (для получения результатов в файлах CSV), API, или SDKs (для интеграции в код).
Самый простой способ начать работу с Google Maps Scraping
Установите SDK Outscraper, выполнив следующую команду.
pip install google-services-api
Инициализация клиента и поиск объявлений в Google или разбор конкретных объявлений путем передачи идентификаторов мест.
* Вы можете получить токен API (SECRET_API_KEY) из файла Страница профиля.
from outscraper import ApiClient
api_client = ApiClient(api_key='SECRET_API_KEY')
# Поиск предприятий в определенных местах:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')
# Получить данные о конкретном месте по идентификатору
результат = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')
# Поиск с большим количеством запросов (пакетный поиск)
результат = api_client.google_maps_search([
'рестораны бруклина сша',
'бары бруклина сша',
], language='en')
print(result)
Вывод результата (сокращенный).
[
[
{
"name": "Colonie",
"full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
"borough": "Brooklyn Heights",
"street": "127 Atlantic Ave",
"city": "Бруклин",
"postal_code": "11201",
"country_code": "США",
"страна": "Соединенные Штаты Америки",
"us_state": "Нью-Йорк",
"state": "Нью-Йорк",
"plus_code": null,
"широта": 40.6908464,
"долгота": -73.9958422,
"time_zone": "Америка/Новый_Йорк",
"popular_times": null,
"site": "http://www.colonienyc.com/",
"phone": "+1 718-855-7500",
"type": "американский ресторан",
"категория": "рестораны",
"подтипы": "Американский ресторан", "Коктейль-бар", "Итальянский ресторан", "Органический ресторан", "Ресторан", "Винный бар",
"посты": null,
"рейтинг": 4.6,
"reviews": 666,
"reviews_data": null,
"photos_count": 486,
"google_id": "0x89c25a4590b8c863:0xc4a4271f166de1e2",
"place_id": "ChIJY8i4kEVawokR4uFtFh8npMQ",
"reviews_link": "https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=en&gl=US",
"reviews_id": "-4277250731621359134",
"photo": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
"street_view": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
"working_hours_old_format": "Понедельник: 5\\u20139:30PM | Вторник: Закрыто | Среда: Закрыто | Четверг: 5\\u20139:30PM | Пятница: 5\\\u20139:30PM | Суббота: 11AM\\u20133PM,5\\u20139:30PM | Воскресенье: 11AM\\u20133PM,5\\u20139:30PM",
"working_hours": {
"понедельник": "5\\\u20139:30PM",
"вторник": "Закрыто",
"Среда": "Закрыто",
"Четверг": "5\\\u20139:30PM",
"Пятница": "5\\\u20139:30PM",
"Суббота": "11AM\\u20133PM,5\\u20139:30PM",
"воскресенье": "11AM\\u20133PM,5\\u20139:30PM"
},
"business_status": "OPERATIONAL",
},
"reserving_table_link": "https://resy.com/cities/ny/colonie",
"booking_appointment_link": "https://resy.com/cities/ny/colonie",
"owner_id": "114275131377272904229",
"verified": true,
"owner_title": "Colonie",
"owner_link": "https://www.google.com/maps/contrib/114275131377272904229",
"location_link": "https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
...
},
...
]
]
Дополнительно: Самый простой способ начать работу с Google Reviews Scraping
Вы можете извлечь обзоры, выполнив следующий код (предполагается, что вы установили пакет python и запустили клиент).
# Получение отзывов о конкретном месте по идентификатору
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')
# Получение отзывов для мест, найденных по поисковому запросу
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')
# Получение только новых отзывов за последние 24 часа
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())
result = api_client.google_maps_reviews(
'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='en')
Вывод результата (сокращенный).
{
"имя": "Мемфис Сеул",
"адрес": "569 Lincoln Pl, Brooklyn, NY 11238, \u0421\u043f\u043e\u043b\u0443\u0447\u0435\u043d\\u0456 \u0428\u0442\u0430\u0442\u0438",
"адрес_улицы": "569 Lincoln Pl",
"owner_id": "100347822687163365487",
"owner_link": "https://www.google.com/maps/contrib/100347822687163365487",
...
"reviews_data": [
{
"google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link": "https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
"autor_name": "Eliott Levy",
"autor_id": "112314095435657473333",
"review_text": "Очень хорошая местная комфортная еда фьюжн! \\\nКимчи капустный салат!!! Потрясающая идея!",
"review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating": 5,
"review_timestamp": 1560692128,
"review_datetime_utc": "06/16/2019 13:35:28",
"review_likes": null
},
{
"google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link": "https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
"autor_name": "fenwar1",
"autor_id": "106144075337788507031",
"review_text": "Отличные крылышки с несколькими видами острого соуса. Макароны с сыром и рамен превосходны.\\nUPDATE:\nВозвращаясь позже, попробуйте слайдер с мясным рулетом, толстый мясной кусок, увенчанный салатом и фантастическим соусом - восхитительно. Считайте меня постоянным клиентом.\\\\\ud83d\\udc4d",
"review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating": 5,
"review_timestamp": 1571100055,
"review_datetime_utc": "10/15/2019 00:40:55",
"review_likes": null
},
...
]
}
0 Комментарии