Skrobanie danych z Google Maps za pomocą Pythona pozwala na gromadzenie cennych informacji o lokalizacjach, firmach i usługach, co jest korzystne dla analizy rynku, identyfikacji optymalnych lokalizacji nowych obiektów, utrzymywania aktualnych katalogów, analizy konkurencji i mierzenia popularności miejsc. Niniejszy przewodnik zawiera kompleksową instrukcję wyodrębniania informacji z Google Maps przy użyciu bibliotek Python requests i lxml. Zawiera szczegółowe instrukcje dotyczące tworzenia żądań, obsługi odpowiedzi, analizowania danych strukturalnych i eksportowania ich do pliku CSV.
Upewnij się, że masz zainstalowane następujące biblioteki Pythona:
W razie potrzeby zainstaluj te biblioteki za pomocą pip:
pip install requests
pip install lxml
Poniżej przedstawimy krok po kroku proces scrapingu wraz z przykładami.
W poniższych sekcjach przeprowadzimy szczegółowy proces skrobania danych z Map Google krok po kroku, wraz z przykładami wizualnymi, które poprowadzą Cię przez każdy etap.
Określ adres URL, z którego chcesz zeskrobać dane.
url = "https link"
Ustawienie odpowiednich nagłówków ma kluczowe znaczenie dla naśladowania działań prawdziwego użytkownika, znacznie zmniejszając szanse na oznaczenie scrapera jako bota. Dodatkowo, integracja serwerów proxy pomaga w utrzymaniu ciągłości skrobania poprzez omijanie wszelkich blokad, które mogą wynikać z przekroczenia limitów żądań związanych z jednym adresem 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",
}
Wyślij żądanie do adresu URL Google Maps i pobierz zawartość strony:
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}")
Użyj lxml do przeanalizowania zawartości HTML:
from lxml import html
parser = html.fromstring(page_content)
Zrozumienie struktury dokumentu HTML ma kluczowe znaczenie dla prawidłowego wyodrębniania danych. Musisz zidentyfikować wyrażenia XPath dla punktów danych, które chcesz zeskrobać. Oto jak można to zrobić:
Nazwa restauracji:
//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()
Adres:
//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[2]/text()
Opcje:
= ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
Szerokość geograficzna:
//div[@jscontroller="AtSb"]/div/@data-lat
Długość geograficzna:
//div[@jscontroller="AtSb"]/div/@data-lng
Wyodrębnij dane przy użyciu zidentyfikowanych ścieżek XP:
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]
# Dołącz do listy danych
data.append({
"restaurant_name": restaurant_name,
"address": address,
"options": options,
"geo_latitude": geo_latitude,
"geo_longitude": geo_longitude
})
Zapisz wyodrębnione dane do pliku 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)
Oto kompletny kod do skrobania danych z Google Maps:
import requests
from lxml import html
import csv
# Zdefiniuj docelowy adres URL i nagłówki
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",
}
# Pobieranie zawartości strony
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()
# Parsowanie zawartości HTML
parser = html.fromstring(page_content)
# Wyodrębnianie danych przy użyciu 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]
# Dołącz do listy danych
data.append({
"restaurant_name": restaurant_name,
"address": address,
"options": options,
"geo_latitude": geo_latitude,
"geo_longitude": geo_longitude
})
# Zapisywanie danych do 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.")
W celu skutecznego skrobania stron internetowych kluczowe jest użycie odpowiednich nagłówków żądań i serwerów proxy. Optymalnym wyborem są serwery proxy centrów danych lub dostawców usług internetowych, które oferują wysokie prędkości i niskie opóźnienia. Ponieważ jednak są to statyczne serwery proxy, konieczne jest wdrożenie rotacji adresów IP, aby skutecznie zapobiegać blokowaniu. Alternatywną i bardziej przyjazną dla użytkownika opcją jest korzystanie z domowych serwerów proxy. Te dynamiczne serwery proxy upraszczają proces rotacji i mają wyższy współczynnik zaufania, dzięki czemu są bardziej skuteczne w omijaniu blokad.
Komentarze: 0