Panduan untuk Mengikis Data Walmart Dengan Python

Komentar: 0

Web scraping adalah cara yang ampuh untuk mengekstrak data dari situs web untuk berbagai tujuan, seperti analisis, penelitian, dan intelijen dalam bisnis. Tutorial ini membantu Anda mengikis informasi produk Walmart di Python dengan fokus pada strategi dan teknik utama. Scraping Walmart menyajikan contoh di mana kita dapat menambang detail produk seperti nama, harga atau ulasan yang ditemukan di berbagai halaman di situs Walmart.

Panduan ini akan menggunakan library request untuk membuat permintaan HTTP dan library lxml untuk mem-parsing konten HTML.

Menyiapkan lingkungan

Sebelum memulai, pastikan Anda telah menginstal Python di komputer Anda. Anda dapat menginstal pustaka yang diperlukan menggunakan pip:

pip install requests
pip install  lxml
pip install urllib3

Selanjutnya, mari kita mengimpor library yang diperlukan:

  • requests: untuk membuat permintaan HTTP untuk mengambil halaman web;
  • lxml: untuk mem-parsing konten HTML;
  • csv: untuk menulis data yang diekstrak ke file CSV;
  • random: untuk memilih proksi acak dan string Agen-Pengguna.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Tentukan URL produk

Daftar URL produk Walmart yang akan dikikis.

product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

String dan proksi Agen-Pengguna

Untuk mengikis situs web, sangat penting untuk menggunakan header yang tepat, terutama header User-Agent, sehingga dapat meniru permintaan dari peramban yang sebenarnya. Selain itu, kita dapat menghindari pembatasan karena tindakan anti-bot yang dilakukan oleh pemilik situs dengan menggunakan server proxy yang dapat diputar. Di bawah ini adalah contoh string User-Agent bersama dengan deskripsi tentang cara mengintegrasikan server proxy yang memerlukan otorisasi berdasarkan alamat IP.

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

Header untuk permintaan

Mengatur tajuk untuk meniru permintaan browser dan menghindari deteksi.

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',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    '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',
}

Inisialisasi penyimpanan data

Buat daftar kosong untuk menyimpan detail produk.

product_details = []

Proses pencacahan untuk halaman URL beroperasi sebagai berikut: Untuk setiap halaman URL, permintaan GET dikirim menggunakan Agen Pengguna dan proxy yang dipilih secara acak. Setelah menerima respons HTML, respons tersebut diuraikan untuk mengekstrak detail seperti nama produk, harga, dan ulasan. Data yang diekstrak disimpan sebagai kamus, yang kemudian ditambahkan ke daftar yang telah dibuat sebelumnya.

for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Kirim permintaan HTTP GET ke URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Mengurai konten HTML menggunakan lxml
   parser = html.fromstring(response.text)
   # Ekstrak judul produk
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Ekstrak harga produk
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Ekstrak detail ulasan
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Menyimpan detail yang diekstrak dalam kamus
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Menambahkan detail produk ke daftar
   product_details.append(product_detail)

Judul:

1.png

Harga:

2.png

Detail ulasan:

3.png

Menyimpan data ke CSV

  1. Buka file CSV baru untuk menulis.
  2. Tentukan nama bidang (kolom) untuk file CSV.
  3. Buat objek csv.DictWriter untuk menulis kamus ke file CSV.
  4. Menulis baris header ke file CSV.
  5. Putar daftar product_details dan tulis setiap kamus produk sebagai baris dalam file CSV.
with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

Kode lengkap:

Berikut ini adalah kode lengkap dengan komentar untuk membantu Anda memahaminya dengan lebih baik:

import requests
from lxml import html
import csv
import random
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# Daftar URL produk yang akan dikikis
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# String Pengguna-Agen yang diacak untuk anonimitas
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# Daftar proxy untuk rotasi IP
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Header untuk meniru permintaan browser
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',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   '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',
}

# Inisialisasi daftar kosong untuk menyimpan detail produk
product_details = []

# Ulangi setiap URL produk
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Kirim permintaan HTTP GET ke URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Mengurai konten HTML menggunakan lxml
   parser = html.fromstring(response.text)
   # Ekstrak judul produk
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Ekstrak harga produk
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Ekstrak detail ulasan
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Menyimpan detail yang diekstrak dalam kamus
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Menambahkan detail produk ke daftar
   product_details.append(product_detail)

# Tulis data yang diekstrak ke file CSV
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

Tutorial kami mendemonstrasikan cara memanfaatkan pustaka Python untuk mengikis data produk dari Walmart dan menyimpannya dalam format CSV untuk analisis selanjutnya. Skrip yang disediakan sangat mendasar dan menawarkan fondasi yang dapat ditingkatkan untuk meningkatkan efisiensi proses pengikisan. Peningkatan dapat mencakup memperkenalkan penundaan acak di antara permintaan untuk meniru pola penjelajahan manusia, menerapkan User-Agent dan rotasi proxy untuk menghindari deteksi, dan mengembangkan sistem penanganan kesalahan yang kuat untuk mengelola potensi gangguan atau kegagalan penggalian.

Komentar:

0 komentar