Python ile Google Haritalar verilerini kazıma kılavuzu

Yorumlar: 0

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.

Ortamınızı ayarlama

Aşağıdaki Python kütüphanelerinin kurulu olduğundan emin olun:

  • talepler;
  • lxml;
  • csv (standart kütüphane).

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.

Google Haritalar'dan veri kazımak için adım adım kılavuz

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.

Adım 1. Hedef URL'yi tanımlayın

Verileri kazımak istediğiniz URL'yi belirtin.


url = "https link"

Adım 2. Başlıkları ve proxy'leri tanımlama

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",
}

Adım 3. Sayfa içeriğini getir

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}")

Adım 4. HTML içeriğini ayrıştırın

HTML içeriğini ayrıştırmak için lxml kullanın:


from lxml import html

parser = html.fromstring(page_content)

Veri XPath'lerinin tanımlanması

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:

  1. Web Sayfasını İnceleyin: Google Haritalar sayfasını bir web tarayıcısında açın ve HTML yapısını incelemek için tarayıcının geliştirici araçlarını (sağ tıklayın > İncele) kullanın.
  2. İlgili Öğeleri Bulun: Kazımak istediğiniz verileri içeren HTML öğelerini arayın (örneğin, restoran adları, adresler).
  3. XPath'ler yazın: HTML yapısını temel alarak, verileri ayıklamak için XPath ifadeleri yazın. Bu kılavuz için XPath'ler şunlardır:

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

Adım 5. Verileri ayıklama

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
    })

Adım 6. Verileri CSV'ye kaydet

Çı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)

Tamamlanmış kod

İş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 yorumlar