Скрапінг даних з Google Maps з використанням Python

Коментарі: 0

Скрапінг даних з Google Maps надає можливість отримувати важливу інформацію про місця розташування, заклади та послуги, яка може бути корисною для аналізу ринку та вибору оптимальних місць для відкриття нових точок, створення актуальних довідників, вивчення конкурентів або оцінки популярності різних місць. У цій статті докладно розглянуто, як витягти інформацію з Google Maps за допомогою Python-бібліотек requests і lxml, включно з етапами надсилання запитів, обробки відповідей, вилучення структурованих даних і їх збереження у форматі CSV.

Підготовчий етап: налаштування середовища

Необхідно переконатися, що на комп'ютері встановлено такі бібліотеки Python:

  • requests;
  • lxml;
  • csv (стандартна бібліотека).

Ці бібліотеки можна встановити за допомогою pip:


pip install requests
pip install lxml

Покроковий процес скрапінгу даних з Google Maps

Далі буде представлено покроковий процес скрапінгу з наочними прикладами.

Крок 1. Встановлення цільового URL

Почніть з визначення URL, який буде використовуватися для збору даних.


url = "Посилання HTTPS"

Крок 2. Конфігурація заголовків і проксі

Налаштування коректних заголовків допомагає симулювати дії реального користувача та зменшує ризик ідентифікації скрапера як бота. Інтеграція проксі-сервера забезпечує безперебійний скрапінг шляхом обходу блокувань, які можуть виникнути внаслідок перевищення ліміту запитів з однієї IP-адреси.


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}

proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

Крок 3. Отримання вмісту сторінки

Виконайте запит до URL Google Maps, щоб отримати вміст сторінки:


import requests

response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")

Крок 4. Аналіз HTML-вмісту

Застосуйте бібліотеку lxml для аналізу HTML-вмісту:


from lxml import html

parser = html.fromstring(page_content)

Визначення XPath для даних

Розуміння структури HTML-документа критично важливе для точного вилучення даних. Ось підходи для визначення XPath виразів:

  1. Дослідження веб-сторінки: Відкрийте сторінку Google Maps у браузері та використовуйте інструменти розробника (ПКМ > Подивитися код елемента), щоб вивчити HTML-структуру.
  2. Пошук потрібних елементів: Ідентифікуйте HTML-елементи, що містять потрібні дані, наприклад, назви ресторанів та їхні адреси.
  3. Формулювання XPath: Сформулюйте вирази XPath, ґрунтуючись на структурі HTML. Для цього посібника приклади XPath виглядають таким чином:

Назва ресторану:


//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()

Адреса:


 //div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[2]/text()

Опції:


 = ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))

Географічна широта:


//div[@jscontroller="AtSb"]/div/@data-lat

Географічна довгота:


 //div[@jscontroller="AtSb"]/div/@data-lng

Крок 5. Витяг даних

Витягніть дані, використовуючи зазначені XPath:


results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    # Додати до списку даних
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

Крок 6. Збереження даних у CSV

Збережіть витягнуті дані у файл CSV:


import csv

with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

Фінальна версія коду


import requests
from lxml import html
import csv

# Визначення цільового URL і заголовків
url = "https://www.google.com/search?sca_esv=04f11db33f1535fb&sca_upv=1&tbs=lf:1,lf_ui:4&tbm=lcl&sxsrf=ADLYWIIFVlh6WQCV6I2gi1yj8ZyvZgLiRA:1722843868819&q=google+map+restaurants+near+me&rflfq=1&num=10&sa=X&ved=2ahUKEwjSs7fGrd2HAxWh1DgGHbLODasQjGp6BAgsEAE&biw=1920&bih=919&dpr=1"
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

# Отримання вмісту сторінки
response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")
    exit()

# Парсинг HTML-контенту
parser = html.fromstring(page_content)

# Витяг даних за допомогою XPath
results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    # Додавання до списку даних
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# Збереження даних у CSV
with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

print("Data has been successfully scraped and saved to google_maps_data.csv.")

Для успішного скрапінгу вкрай важливо застосовувати відповідні заголовки запитів і проксі. Найоптимальнішим вибором проксі для таких завдань стануть проксі дата центрів або ISP, оскільки вони забезпечують високу швидкість завантаження і низький пінг. Однак, важливо враховувати, що вони є статичними, і для ефективного уникнення блокувань необхідно реалізувати ротацію - регулярну зміну IP-адрес. Альтернативним і зручнішим варіантом стане використання резидентських проксі, які є динамічними, завдяки чому процес їхньої зміни значно спрощується. Додатково, вони мають вищий показник траст-фактора, через що найбільш ефективні в контексті обходу блокувань.

Коментарії:

0 Коментаріїв