Оглавление

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

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

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

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

  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 # to extract data from HTML using XPath or CSS selectors
				
			

Инициализация и запуск Webdriver

Перед инициализацией Webdriver убедитесь, что вы выполнили предыдущие шаги и у вас есть путь к файлу chromedriver. Инициализируйте драйвер следующим кодом. Вы должны увидеть новое открытое окно Chrome.

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # use the path to the driver you downloaded from previous steps
driver = webdriver.Chrome(chromedrive_path)
				
			

На mac вы можете увидеть следующее: "chromedriver не может быть открыт, потому что разработчик не может быть проверен". Чтобы решить эту проблему, щелкните хромированный драйвер в Finder, выберите Open в меню, а затем нажмите Open в появившемся диалоговом окне. В открывшемся окне терминала вы должны увидеть надпись "ChromeDriver был запущен успешно". Закройте его, после чего вы сможете запускать 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')

# Search for businesses in specific locations:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Get data of the specific place by id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Search with many queries (batching)
result = api_client.google_maps_search([
    'restaurants brooklyn usa',
    'bars brooklyn usa',
], language='en')

print(result)
				
			

Вывод результата (сокращенный).

				
					[
  [
    {
      "name": "Colonie",
      "full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough": "Brooklyn Heights",
      "street": "127 Atlantic Ave",
      "city": "Brooklyn",
      "postal_code": "11201",
      "country_code": "US",
      "country": "United States of America",
      "us_state": "New York",
      "state": "New York",
      "plus_code": null,
      "latitude": 40.6908464,
      "longitude": -73.9958422,
      "time_zone": "America/New_York",
      "popular_times": null,
      "site": "http://www.colonienyc.com/",
      "phone": "+1 718-855-7500",
      "type": "American restaurant",
      "category": "restaurants",
      "subtypes": "American restaurant, Cocktail bar, Italian restaurant, Organic restaurant, Restaurant, Wine bar",
      "posts": null,
      "rating": 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": "Monday: 5\\u20139:30PM | Tuesday: Closed | Wednesday: Closed | Thursday: 5\\u20139:30PM | Friday: 5\\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\\u20133PM,5\\u20139:30PM",
      "working_hours": {
        "Monday": "5\\u20139:30PM",
        "Tuesday": "Closed",
        "Wednesday": "Closed",
        "Thursday": "5\\u20139:30PM",
        "Friday": "5\\u20139:30PM",
        "Saturday": "11AM\\u20133PM,5\\u20139:30PM",
        "Sunday": "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 и запустили клиент).

				
					# Get reviews of the specific place by id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Get reviews for places found by search query
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Get only new reviews during last 24 hours
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')
				
			

Вывод результата (сокращенный).

				
					{
  "name": "Memphis Seoul",
  "address": "569 Lincoln Pl, Brooklyn, NY 11238, \\u0421\\u043f\\u043e\\u043b\\u0443\\u0447\\u0435\\u043d\\u0456 \\u0428\\u0442\\u0430\\u0442\\u0438",
  "address_street": "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": "Very good local comfort fusion food ! \\nKimchi coleslaw !! Such an amazing idea !",
      "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": "Great wings with several kinds of hot sauce. The mac and cheese ramen is excellent.\\nUPDATE:\\nReturned later to try the meatloaf slider, a thick meaty slice  topped with slaw and a fantastic sauce- delicious. \\nConsider me a regular.\\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
    },
    ...
  ]
}
				
			

Часто Задаваемые Вопросы

Наиболее частые вопросы и ответы

Благодаря SDK от Outscraper стало возможным соскабливать данные Google Maps с помощью Python Selenium. Ознакомьтесь с документацией Outscraper Google Maps Places API, чтобы узнать, что можно сделать.

Используя Python и Selenium, можно автоматизировать процесс соскабливания данных с Google Maps. Outscraper предлагает API Google Maps Places и SDK, которые упрощают эту задачу.

С помощью Python и Selenium можно автоматизировать соскабливание Google Maps. Outscraper Google Maps Places API и SDK позволяют сделать это самым простым способом.

Категории: Pyhton

Влад

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

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

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

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