Скрапінг даних з Google Maps надає можливість отримувати важливу інформацію про місця розташування, заклади та послуги, яка може бути корисною для аналізу ринку та вибору оптимальних місць для відкриття нових точок, створення актуальних довідників, вивчення конкурентів або оцінки популярності різних місць. У цій статті докладно розглянуто, як витягти інформацію з Google Maps за допомогою Python-бібліотек requests і lxml, включно з етапами надсилання запитів, обробки відповідей, вилучення структурованих даних і їх збереження у форматі CSV.
Необхідно переконатися, що на комп'ютері встановлено такі бібліотеки Python:
Ці бібліотеки можна встановити за допомогою pip:
pip install requests
pip install lxml
Далі буде представлено покроковий процес скрапінгу з наочними прикладами.
Почніть з визначення URL, який буде використовуватися для збору даних.
url = "Посилання HTTPS"
Налаштування коректних заголовків допомагає симулювати дії реального користувача та зменшує ризик ідентифікації скрапера як бота. Інтеграція проксі-сервера забезпечує безперебійний скрапінг шляхом обходу блокувань, які можуть виникнути внаслідок перевищення ліміту запитів з однієї 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",
}
Виконайте запит до 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}")
Застосуйте бібліотеку lxml для аналізу HTML-вмісту:
from lxml import html
parser = html.fromstring(page_content)
Розуміння структури 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
Витягніть дані, використовуючи зазначені 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:
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-адрес. Альтернативним і зручнішим варіантом стане використання резидентських проксі, які є динамічними, завдяки чому процес їхньої зміни значно спрощується. Додатково, вони мають вищий показник траст-фактора, через що найбільш ефективні в контексті обходу блокувань.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Коментарі: 0