scrpae google maps by selenium
Управление браузером Chrome с помощью Selenium

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

В этой статье вы увидите пошаговое руководство по разработке скрепера, который сможет парсить места из Google Maps без блокировки даже после 1000+ страниц.

Что нам понадобится для создания гусеницы

  1. Python 3+.
  2. Установлен браузер Chrome.
  3. Selenium 3.141.0+ (пакет python).
  4. Драйвер Chrome (для вашей ОС).
  5. 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 карт google
Поиск xpath к элементам, которые мы хотим получить с помощью консоли разработчика

Вы можете разобрать содержимое 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
    },
    ...
  ]
}
				
			
Категории: Pyhton

Влад

Руководитель проекта Linkedin

0 Комментарии

Добавить комментарий

Заполнитель аватара