Cara Mengikis Situs Web E-Commerce dengan Python

Komentar: 0

Pengikisan data ecommerce untuk detail produk berguna untuk melakukan analisis kompetitif, pemantauan harga, dan melakukan riset pasar. Scraping data dari halaman produk dapat dilakukan dengan mudah menggunakan Python. Tutorial scraping ecommerce ini akan menunjukkan kepada Anda cara mengambil informasi menggunakan kombinasi permintaan dan lxml dari toko online.

Mengikis halaman web untuk e-commerce terdiri dari mendapatkan informasi produk seperti judul, harga, atau nomor pengenal dari toko-toko di internet. Banyaknya pustaka yang tersedia di Python membuat hal ini tidak hanya mudah tetapi juga cukup efisien. Pada artikel ini, kita akan fokus pada web scraping situs web e-commerce menggunakan Python. Situs web Costco akan menjadi objek kita.

Menulis Skrip untuk Penggalian Data Ecommerce

Untuk memulainya, mari kita pastikan kita memiliki semua alat atau pustaka scraping ecommerce Python yang tersedia yang akan kita perlukan untuk skrip ini:


pip install requests
pip install lxml

Kami akan fokus pada mengekstrak nama produk, fitur, dan merek dari halaman tertentu di situs web.

Langkah 1. Memahami struktur HTML situs web

Untuk memulai membangun scraper produk e-commerce, pertama-tama Anda harus memahami bagaimana sebuah halaman web terstruktur. Buka situs web dan buka halaman yang ingin Anda kumpulkan informasinya, dan periksa elemen-elemen yang diperlukan (misalnya nama produk, fitur, merek, dll.).

Langkah 2. Mengirim permintaan HTTP

Pertama, kita akan mengimpor pustaka permintaan untuk mengirim GET khususnya untuk halaman produk. Selain itu, kita juga akan mengonfigurasi tajuk permintaan agar menyerupai permintaan peramban.


import requests

# Daftar URL produk yang akan dikikis
urls = [
    "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
    "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    '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',
}

# Ulangi setiap URL dan kirimkan permintaan GET
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # Pemrosesan lebih lanjut akan ditambahkan pada langkah selanjutnya
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Langkah 3. Mengekstrak data menggunakan XPath dan lxml

Dengan lxml, kita akan mengekstrak info yang diinginkan dari html. Hal ini sangat penting ketika berurusan dengan pengikisan data e-commerce.


from lxml import html

# Daftar untuk menyimpan data yang dikikis
scraped_data = []

# Ulangi setiap URL dan kirimkan permintaan GET
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Mengurai konten HTML dengan lxml
        tree = html.fromstring(html_content)
        
       # Mengekstrak data menggunakan XPath
        product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
        product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
        product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
        
        # Menambahkan data yang diekstrak ke daftar
        scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Mencetak data yang dikikis
for item in scraped_data:
    print(item)

Langkah 4. Mengatasi masalah potensial

Ketika kita mencoba mengikis situs web e-niaga dengan Python, kita perlu memahami bahwa sebagian besar situs web memiliki beberapa bentuk perangkat lunak anti-bot. Menggunakan proxy dan agen pengguna bergilir dapat membantu mengurangi kecurigaan mereka.

Menggunakan proxy dengan otorisasi IP:


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)

Memutar Agen Pengguna:


import random

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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # Tambahkan lebih banyak agen pengguna sesuai kebutuhan
]

headers['user-agent'] = random.choice(user_agents)

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

Langkah 5. Menyimpan data ke file CSV

Pada akhirnya, data yang diekstrak akan disimpan dalam format CSV sehingga saya dapat menganalisisnya nanti untuk proses scraping data e-commerce yang lebih lanjut.


import csv

csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Menulis data ke file CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for item in scraped_data:
            writer.writerow(item)
    print(f"Data saved to {csv_file}")
except IOError:
    print(f"Error occurred while writing data to {csv_file}")

Kode lengkap

Berikut ini adalah versi final dari skrip untuk pengikisan data e-commerce yang efektif. Anda dapat menyalin dan menempelkannya agar mudah digunakan.


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

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

# Daftar URL produk yang akan dikikis
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

# headers
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-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   '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',
}

# Daftar agen pengguna untuk permintaan bergilir
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   # Tambahkan lebih banyak agen pengguna sesuai kebutuhan
]


# Daftar proxy untuk permintaan bergilir
proxies = [
    {'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
    # Tambahkan lebih banyak proxy sesuai kebutuhan
]

# Daftar untuk menyimpan data yang dikikis
scraped_data = []

# Ulangi setiap URL dan kirimkan permintaan GET
for url in urls:
   # Pilih agen pengguna secara acak untuk tajuk permintaan
   headers['user-agent'] = random.choice(user_agents)
   # Pilih proxy acak untuk permintaan tersebut
   proxy = random.choice(proxies)

   # Kirim permintaan HTTP GET ke URL dengan header dan proxy
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Menyimpan konten HTML dari respons
       html_content = response.content
       # Mengurai konten HTML dengan lxml
       tree = html.fromstring(html_content)

       # Mengekstrak data menggunakan XPath
       product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
       product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
       product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()

       # Menambahkan data yang diekstrak ke daftar
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # Mencetak pesan kesalahan jika permintaan gagal
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Pengaturan file CSV
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Menulis data ke file CSV
try:
   with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
       writer = csv.DictWriter(file, fieldnames=fieldnames)
       writer.writeheader()
       for item in scraped_data:
           writer.writerow(item)
   print(f"Data saved to {csv_file}")
except IOError:
   # Mencetak pesan kesalahan jika penulisan ke file gagal
   print(f"Error occurred while writing data to {csv_file}")

Scraper ecommerce Python sudah selesai sekarang.

Pengikisan Data Ecommerce: Pemikiran Akhir

Penggunaan scraper web ecommerce untuk toko online Costco menunjukkan betapa efektifnya Python dalam memperoleh data produk untuk analisis dan pengambilan keputusan bisnis yang optimal. Dengan skrip dan pustaka yang tepat, yaitu Request dan Lxml untuk menyediakan ekstraktor otomatis, memungkinkan untuk mengikis situs tanpa gangguan alur kerja yang disebabkan oleh API anti-bot. Terakhir, sangat penting untuk selalu mematuhi peraturan etika saat melakukan scraping web e-commerce.

Komentar:

0 komentar