Руководство по скрапингу данных с 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 = "Сcылка 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 комментариев