Зміст

Використання Селен у скрапінгу даних - досить поширене явище. Він автоматизує роботу браузерів і дозволяє імітувати реальні дії користувачів, щоб уникнути блокування. Це особливо корисно при скрапінгу JavaScript сайтів, що динамічно генеруються, таких як Google. Крім того, це допомагає уникнути будь-якого захисту від сканування, оскільки фактично імітує поведінку реальних клієнтів.

У цій статті ви побачите покрокове керівництво по розробці скрапера, який зможе парсити місця з Google Maps і не блокуватися навіть після 1000+ сторінок.

СКРПЕ Google Maps за селеном
Controlling Chrome Browser With Selenium

Що нам знадобиться для побудови кроулера

  1. Python 3+.
  2. Встановлено браузер Chrome.
  3. Selenium 3.141.0+ (пакет python).
  4. Chrome Driver (для вашої ОС).
  5. Parsel або будь-яку іншу бібліотеку для вилучення даних з HTML на кшталт Beautiful Soup.

Покрокова інструкція по створенню Google Maps Extractor

Завантаження та збереження ChromeDriver

Для використання Selenium з Google Chrome вам потрібно зв'язати python-код з браузером за допомогою ChromeDriver.

Завантажте версію ChromeDriver, яка відповідає вашій версії браузера та типу операційної системи. Номер версії вашого браузера Chrome можна знайти тут: Chrom -> Значок меню (правий верхній кут) -> Довідка -> Про Google Chrome.

Розархівуйте файл chromedriver і збережіть його десь у вашій системі (шлях до нього ми будемо використовувати пізніше). У цьому прикладі ми зберігаємо файл у папці проекту.

Встановлення пакетів селену та парселу

Встановіть пакети Selenium і Parsel, виконавши наступні команди. Parsel ми будемо використовувати пізніше, коли будемо розбирати вміст з HTML.

				
					pip install selenium
pip install parsel # to extract data from HTML using XPath or CSS selectors
				
			

Ініціалізація та запуск веб-драйвера

Перед ініціалізацією 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, виберіть у меню "Відкрити", а потім у діалоговому вікні, що з'явилося, натисніть "Відкрити". У вікні терміналу, що відкрилося, ви повинні побачити напис "ChromeDriver був успішно запущений". Закрийте його і після цього ви зможете запустити ChromeDriver зі свого коду.

Завантажити сторінку Google Maps

Once you start the driver you are ready to open some pages. To open any page, use the “get” command.

				
					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 у правому верхньому куті вікна браузера і вибравши "Інші інструменти" > "Інструменти розробника". Тепер ви зможете побачити елементи вашої сторінки.

HTML-парсинг google maps
Finding XPath to Elements We Want to Get With Developer Console

Ви можете розібрати вміст HTML-сторінки за допомогою ваших улюблених інструментів парсинга. Ми будемо використовувати Parsel в цьому підручнику.

				
					from parsel import Selector

response = Selector(page_content)
				
			

Iterate over listings and get each place’s data.

				
					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)
				
			

Output from Google Maps places (shortened).

				
					[
  {
    '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або SDK (інтегрувати в код).

Найпростіший спосіб розпочати роботу зі скрапінгом Google Maps

Install Outscraper’s SDK by running the following command.

				
					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

Ви можете отримати відгуки, виконавши наступний код (за умови, що у вас встановлений пакет 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
    },
    ...
  ]
}
				
			

ПОШИРЕНІ ЗАПИТАННЯ

Найпоширеніші запитання та відповіді

Thanks to Outscraper’s SDK, it is possible to scrape Google Maps data with Python Selenium. Check out the Outscraper Google Maps Places API documentation to see what you can do.

Using Python and Selenium, it is possible to automate the process of scraping data from Google Maps. Outscraper offers a Google Maps Places API and SDKs which simplify this task.

It is possible to automate Google Maps scraping using Python and Selenium. Outscraper Google Maps Places API and SDKs allow you to do this in the easiest way.

Категорії: Пітон

Влад

Керівник проекту Linkedin

0 Коментарі

Залишити відповідь

Заповнювач аватара