Cara mengikis situs web E-Commerce dengan Python

Komentar: 0

Untuk analisis kompetitif, pemantauan harga, dan riset pasar, penting untuk mengikis data produk dari situs web e-commerce. Anda dapat menggunakan Python untuk mengikis data dari halaman produk secara efisien. Dalam panduan ini, kami akan mendemonstrasikan cara mengikis informasi produk dari toko online menggunakan kombinasi permintaan dan lxml.

Scraping e-commerce melibatkan penggalian detail produk seperti nama, harga, dan ID dari toko online. Python, dengan pustaka serbaguna, membuat tugas ini menjadi efisien dan mudah. Dalam panduan ini, kita akan mengikis informasi produk dari situs web Costco.

Menulis skrip untuk mengekstrak data produk

Sebelum masuk ke dalam proses scraping, pastikan Anda telah menginstal pustaka Python yang diperlukan:

pip install requests
pip install lxml

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

Langkah 1. Memahami struktur HTML situs web

Untuk mengekstrak data dari situs web apa pun, Anda perlu memahami struktur halaman web. Buka halaman situs web dan periksa elemen yang ingin Anda kikis (misalnya, nama produk, merek fitur, dll).

Langkah 2. Mengirim permintaan HTTP

Pertama, kita akan menggunakan pustaka permintaan untuk mengirim permintaan HTTP GET ke halaman produk. Kita juga akan menyiapkan header permintaan untuk meniru permintaan peramban yang sebenarnya.


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 menggunakan lxml, kita akan mengekstrak titik data yang diperlukan dari HTML yang diuraikan.

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-masalah potensial

Situs web sering kali menerapkan langkah-langkah anti-bot. Menggunakan proksi dan agen pengguna bergilir dapat membantu menghindari deteksi.

Menggunakan proksi 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

Terakhir, kita akan menyimpan data yang telah dikikis ke file CSV untuk analisis 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


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"
]

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

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

Menggunakan Python untuk mengikis dari situs e-commerce seperti Costco adalah metode yang efektif untuk mengumpulkan informasi produk untuk dianalisis serta membuat keputusan strategis. Pemanfaatan pustaka yang tepat, misalnya, Request dan juga Lxml menghasilkan proses ekstraksi otomatis yang dapat menangani konten HTML tanpa melupakan implementasi API anti-bot secara efektif. Perlu dicatat bahwa protokol pengikisan etis harus selalu diikuti.

Komentar:

0 komentar