Python kullanarak Google Haritalar'dan veri kazımak, konumlar, işletmeler ve hizmetler hakkında değerli bilgilerin toplanmasına olanak tanır; bu da pazar analizi, en uygun yeni mekan konumlarının belirlenmesi, mevcut dizinlerin korunması, rakip analizi ve mekanların popülerliğinin ölçülmesi için faydalıdır. Bu kılavuz, Python kütüphaneleri requests ve lxml kullanılarak Google Haritalar'dan nasıl bilgi alınacağına dair kapsamlı bir yol göstermektedir. İstek yapma, yanıtları işleme, yapılandırılmış verileri ayrıştırma ve bir CSV dosyasına aktarma hakkında ayrıntılı talimatlar içerir.
Aşağıdaki Python kütüphanelerinin kurulu olduğundan emin olun:
Gerekirse bu kütüphaneleri pip kullanarak yükleyin:
pip install requests
pip install lxml
Aşağıda, örneklerle birlikte adım adım bir kazıma süreci sunacağız.
Aşağıdaki bölümlerde, Google Haritalar'dan veri kazımak için ayrıntılı bir adım adım süreci, her aşamada size rehberlik edecek görsel örneklerle tamamlayacağız.
Verileri kazımak istediğiniz URL'yi belirtin.
url = "https link"
Uygun başlıkların ayarlanması, gerçek bir kullanıcının faaliyetlerini taklit etmek için çok önemlidir ve kazıyıcının bot olarak işaretlenme olasılığını önemli ölçüde azaltır. Ayrıca, proxy sunucularının entegre edilmesi, tek bir IP adresiyle ilişkili istek sınırlarının aşılmasından kaynaklanabilecek engellemeleri aşarak sürekli kazıma faaliyetlerinin sürdürülmesine yardımcı olur.
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",
}
Google Haritalar URL'sine bir istek gönderin ve sayfa içeriğini alın:
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}")
HTML içeriğini ayrıştırmak için lxml kullanın:
from lxml import html
parser = html.fromstring(page_content)
HTML belgesinin yapısını anlamak, verileri doğru şekilde ayıklamak için çok önemlidir. Kazımak istediğiniz veri noktaları için XPath ifadelerini tanımlamanız gerekir. İşte bunu nasıl yapabileceğiniz:
Restoran Adı:
//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()
Seçenekler:
= ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
Geo Latitude:
//div[@jscontroller="AtSb"]/div/@data-lat
Coğrafi Boylam:
//div[@jscontroller="AtSb"]/div/@data-lng
Tanımlanan XPath'leri kullanarak verileri ayıklayın:
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]
# Veri listesine ekle
data.append({
"restaurant_name": restaurant_name,
"address": address,
"options": options,
"geo_latitude": geo_latitude,
"geo_longitude": geo_longitude
})
Çıkarılan verileri bir CSV dosyasına kaydedin:
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)
İşte Google Haritalar verilerini kazımak için eksiksiz kod:
import requests
from lxml import html
import csv
# Hedef URL'yi ve üstbilgileri tanımlayın
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",
}
# Sayfa içeriğini getir
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 içeriğini ayrıştırma
parser = html.fromstring(page_content)
# XPath kullanarak veri ayıklama
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]
# Veri listesine ekle
data.append({
"restaurant_name": restaurant_name,
"address": address,
"options": options,
"geo_latitude": geo_latitude,
"geo_longitude": geo_longitude
})
# Verileri CSV'ye kaydetme
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.")
Etkili web kazıma için doğru istek başlıklarını ve proxy'leri kullanmak çok önemlidir. En uygun proxy seçenekleri, yüksek hız ve düşük gecikme süresi sunan veri merkezi veya ISP proxy'leridir. Ancak bunlar statik proxy'ler olduğundan, etkin bir şekilde engellenmeyi önlemek için IP rotasyonu uygulamak gerekir. Alternatif ve daha kullanıcı dostu bir seçenek ise konut proxy'leri kullanmaktır. Bu dinamik proxy'ler rotasyon sürecini basitleştirir ve daha yüksek bir güven faktörüne sahiptir, bu da onları blokları atlatmada daha etkili hale getirir.
Yorumlar: 0