Cara mengikis Yelp menggunakan Python

Komentar: 0

Mengikis data dari Yelp dapat memberikan wawasan berharga tentang restoran lokal, termasuk detail seperti nama, URL, masakan, dan peringkat. Dengan menggunakan library Python request dan lxml, tutorial ini akan menunjukkan cara mengikis hasil pencarian Yelp. Beberapa teknik yang akan dibahas termasuk menggunakan proxy, menangani header dan mengekstrak data dengan XPath.

Langkah 1: Menyiapkan lingkungan

Sebelum memulai proses scraping, pastikan Anda telah menginstal Python dan pustaka yang diperlukan:

pip install requests
pip install lxml

Pustaka-pustaka ini akan membantu kita mengirim permintaan HTTP ke Yelp, mengurai konten HTML, dan mengekstrak data yang kita perlukan.

Langkah 2: Mengirim permintaan ke Yelp

Pertama, kita perlu mengirim permintaan GET ke halaman hasil pencarian Yelp untuk mengambil konten HTML. Berikut cara melakukannya:

import requests

# URL halaman pencarian Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Kirim permintaan GET untuk mengambil konten HTML
response = requests.get(url)

# Periksa apakah permintaan berhasil
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

Memahami header HTTP

Saat membuat permintaan ke situs web, penting untuk menyertakan header HTTP yang sesuai. Header dapat berisi metadata tentang permintaan, seperti agen pengguna, yang mengidentifikasi peramban atau alat yang membuat permintaan. Menyertakan header ini dapat membantu menghindari pemblokiran atau pelambatan oleh situs web target.

Berikut ini cara menyiapkan header:

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-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    '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',
}

response = requests.get(url, headers=headers)

Menerapkan rotasi proxy

Saat mengikis halaman dalam jumlah besar, ada risiko alamat IP Anda diblokir oleh situs target. Untuk mencegah hal ini, disarankan untuk menggunakan server proxy. Untuk panduan ini, disarankan untuk menggunakan server proxy dinamis yang memiliki fitur rotasi otomatis. Dengan cara ini, Anda hanya perlu mengatur pengaturan server proxy sekali saja, dan rotasi akan membantu mempertahankan akses dengan mengubah alamat IP secara berkala, sehingga mengurangi kemungkinan diblokir.

proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

response = requests.get(url, headers=headers, proxies=proxies)

Langkah 3: Mengurai konten HTML dengan lxml

Setelah kita memiliki konten HTML, langkah selanjutnya adalah mem-parsing dan mengekstrak data yang relevan. Kita akan menggunakan pustaka lxml untuk tujuan ini.

from lxml import html

# Mengurai konten HTML menggunakan lxml
parser = html.fromstring(response.content)

Mengidentifikasi Elemen yang Akan Dikikis

Kita perlu menargetkan masing-masing daftar restoran pada halaman hasil pencarian. Elemen-elemen ini dapat diidentifikasi dengan menggunakan ekspresi XPath. Untuk Yelp, daftar biasanya dibungkus dalam elemen div dengan atribut data-testid tertentu.

# Mengekstrak masing-masing elemen restoran
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

Menggunakan XPath untuk ekstraksi data

XPath adalah alat yang ampuh untuk menavigasi dan memilih node dari dokumen HTML. Dalam tutorial ini, kita akan menggunakan ekspresi XPath untuk mengekstrak nama restoran, URL, masakan, dan rating dari setiap elemen restoran.

Berikut adalah XPath spesifik untuk setiap titik data:

  1. Nama Restoran: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()
  2. URL Restoran: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href
  3. Masakan: .//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()
  4. Peringkat: .//div[@class="y-css-9tnml4"]/@aria-label

Langkah 4: Mengekstrak data dari setiap daftar restoran

Sekarang kita telah memiliki konten HTML dan telah menangani potensi pemblokiran IP, kita dapat mengekstrak data yang diperlukan dari setiap daftar restoran.

restaurants_data = []

# Lakukan pengulangan pada setiap elemen restoran
for element in elements:
    # Ekstrak nama restoran
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Ekstrak URL restoran
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Ekstrak masakan
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Ekstrak peringkat
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Membuat kamus untuk menyimpan data
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Menambahkan info restoran ke dalam daftar
    restaurants_data.append(restaurant_info)

Langkah 5: Menyimpan data sebagai JSON

Setelah mengekstrak data, kita perlu menyimpannya dalam format terstruktur. JSON adalah format yang banyak digunakan untuk tujuan ini.

import json

# Menyimpan data ke file JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Kode lengkap

import requests
from lxml import html
import json

# URL halaman pencarian Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Mengatur header untuk meniru permintaan browser
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.5'
}

# Siapkan proxy jika diperlukan
proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

# Kirim permintaan GET untuk mengambil konten HTML
response = requests.get(url, headers=headers, proxies=proxies)

# Periksa apakah permintaan berhasil
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

# Mengurai konten HTML menggunakan lxml
parser = html.fromstring(response.content)

# Mengekstrak masing-masing elemen restoran
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

# Inisialisasi daftar untuk menampung data yang diekstrak
restaurants_data = []

# Ulangi setiap elemen restoran
for element in elements:
    # Ekstrak nama restoran
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Ekstrak URL restoran
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Ekstrak masakan
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Ekstrak peringkat
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Membuat kamus untuk menyimpan data
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Menambahkan info restoran ke dalam daftar
    restaurants_data.append(restaurant_info)

# Menyimpan data ke file JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Sangat penting bagi pengguna untuk mengonfigurasi header HTTP dengan benar dan menggunakan proxy untuk menghindari pembatasan dan menghindari pemblokiran. Untuk pengalaman scraping yang dioptimalkan dan lebih aman, pertimbangkan untuk mengotomatiskan rotasi IP. Menggunakan proxy perumahan atau seluler yang dinamis dapat secara signifikan meningkatkan proses ini, mengurangi kemungkinan terdeteksi dan diblokir.

Komentar:

0 komentar