Panduan untuk mengikis data Google Maps dengan Python

Komentar: 0

Mengekstrak data dari Google Maps menggunakan Python memungkinkan pengumpulan informasi berharga tentang lokasi, bisnis, dan layanan, yang bermanfaat untuk analisis pasar, mengidentifikasi lokasi tempat baru yang optimal, memelihara direktori saat ini, analisis pesaing, dan mengukur popularitas tempat. Panduan ini memberikan panduan komprehensif tentang cara mengekstrak informasi dari Google Maps dengan menggunakan pustaka Python request dan lxml. Panduan ini mencakup instruksi terperinci tentang cara membuat permintaan, menangani respons, mengurai data terstruktur, dan mengekspornya ke file CSV.

Menyiapkan lingkungan Anda

Pastikan Anda telah menginstal pustaka Python berikut ini:

  • permintaan;
  • lxml;
  • csv (pustaka standar).

Instal pustaka-pustaka ini menggunakan pip jika diperlukan:


pip install requests
pip install lxml

Di bawah ini, kami akan menyajikan proses pengikisan langkah demi langkah, lengkap dengan contohnya.

Panduan langkah demi langkah untuk mengambil data dari Google Maps

Pada bagian berikut ini, kami akan memandu Anda melalui proses langkah demi langkah yang mendetail untuk mengikis data dari Google Maps, lengkap dengan contoh visual untuk memandu Anda melalui setiap tahap.

Langkah 1. Tentukan URL target

Tentukan URL dari mana Anda ingin mengikis data.


url = "https link"

Langkah 2. Tentukan tajuk dan proksi

Menyiapkan header yang tepat sangat penting untuk meniru aktivitas pengguna asli, secara signifikan mengurangi kemungkinan scraper ditandai sebagai bot. Selain itu, mengintegrasikan server proxy membantu mempertahankan aktivitas scraping yang berkelanjutan dengan menghindari pemblokiran apa pun yang mungkin timbul akibat melebihi batas permintaan yang terkait dengan satu alamat 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",
}

Langkah 3. Mengambil konten halaman

Kirim permintaan ke URL Google Maps dan dapatkan konten halaman:


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

Langkah 4. Mengurai konten HTML

Gunakan lxml untuk mengurai konten HTML:


from lxml import html

parser = html.fromstring(page_content)

Mengidentifikasi data XPaths

Memahami struktur dokumen HTML sangat penting untuk mengekstrak data dengan benar. Anda perlu mengidentifikasi ekspresi XPath untuk titik data yang ingin Anda kikis. Berikut ini cara Anda melakukannya:

  1. Periksa Halaman Web: Buka halaman Google Maps di browser web dan gunakan alat bantu pengembang browser (klik kanan > Inspect) untuk memeriksa struktur HTML.
  2. Temukan Elemen yang Relevan: Cari elemen HTML yang berisi data yang ingin Anda kikis (misalnya, nama restoran, alamat).
  3. Menulis XPath: Berdasarkan struktur HTML, tulis ekspresi XPath untuk mengekstrak data. Untuk panduan ini, XPath yang dimaksud adalah:

Nama Restoran:


//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()

Alamat:


 //div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[2]/text()

Pilihan:


 = ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))

Geo Lintang:


//div[@jscontroller="AtSb"]/div/@data-lat

Geo Bujur:


 //div[@jscontroller="AtSb"]/div/@data-lng

Langkah 5. Mengekstrak data

Ekstrak data menggunakan XPath yang telah diidentifikasi:


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]

    # Tambahkan ke daftar data
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

Langkah 6. Menyimpan data ke CSV

Simpan data yang diekstrak ke file 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)

Kode lengkap

Berikut ini adalah kode lengkap untuk mengikis data Google Maps:


import requests
from lxml import html
import csv

# Tentukan URL dan header target
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",
}

# Mengambil konten halaman
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()

# Mengurai konten HTML
parser = html.fromstring(page_content)

# Mengekstrak data menggunakan 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]

    # Tambahkan ke daftar data
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# Menyimpan data ke 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.")

Untuk scraping web yang efektif, sangat penting untuk menggunakan header permintaan dan proxy yang tepat. Pilihan proxy yang optimal adalah proxy pusat data atau ISP, yang menawarkan kecepatan tinggi dan latensi rendah. Namun, karena ini adalah proxy statis, menerapkan rotasi IP diperlukan untuk mencegah pemblokiran secara efektif. Pilihan alternatif dan lebih mudah digunakan adalah menggunakan proxy perumahan. Proksi dinamis ini menyederhanakan proses rotasi dan memiliki faktor kepercayaan yang lebih tinggi, sehingga lebih efektif dalam menghindari pemblokiran.

Komentar:

0 komentar