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.
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:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Daftar URL produk Walmart yang akan dikikis.
product_urls = [
'link with https',
'link with https',
'link with https'
]
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>',
]
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',
}
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:
Harga:
Detail ulasan:
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)
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