Mengakses data dari raksasa e-commerce seperti Amazon sangat penting untuk analisis pasar, strategi penetapan harga, dan riset produk. Data ini dapat dikumpulkan melalui web scraping, sebuah metode yang melibatkan penggalian informasi dalam jumlah besar dari situs web. Namun, Amazon sangat melindungi datanya dengan ketat, membuat teknik scraping tradisional sering kali tidak efektif. Dalam panduan komprehensif ini, kita akan mempelajari metode-metode pengumpulan data produk dari Amazon dan mendiskusikan strategi untuk menghindari sistem anti-scraping yang kuat dari platform ini. Kita akan mengeksplorasi penggunaan Python, proxy, dan teknik scraping tingkat lanjut yang dapat membantu mengatasi tantangan-tantangan ini dan secara efisien mengambil data yang diperlukan untuk tujuan bisnis atau penelitian Anda.
Agar berhasil mengikis data dari Amazon, Anda dapat mengikuti algoritme terstruktur yang diuraikan di bawah ini. Metode ini memastikan Anda mengambil informasi yang dibutuhkan secara efisien dan akurat.
Langkah 1: Mengirim permintaan HTTP ke halaman produk Amazon:
Langkah 2: Mengurai konten HTML:
Langkah 3: Menyimpan data:
Amazon menggunakan beberapa langkah untuk menghalangi upaya pengikisan, termasuk batasan kecepatan koneksi, integrasi CAPTCHA, dan pemblokiran IP. Pengguna dapat menerapkan tindakan pencegahan untuk menghindari hambatan ini, seperti memanfaatkan proksi berkualitas tinggi.
Untuk aktivitas penggalian yang ekstensif, teknik Python tingkat lanjut dapat digunakan untuk memanen data produk dalam jumlah besar. Teknik-teknik ini termasuk pengisian header dan sidik jari TLS, yang membantu menghindari deteksi dan memastikan ekstraksi data yang sukses.
Langkah-langkah ini akan dijelaskan pada bagian selanjutnya dari artikel ini, di mana kita akan melihat implementasi praktisnya menggunakan Python 3.12.2
Untuk memulai proyek scraping web, kita akan mulai dengan menyiapkan scraper dasar menggunakan pustaka lxml untuk penguraian HTML dan pustaka permintaan untuk mengelola permintaan HTTP yang diarahkan ke server web Amazon.
Fokus kami adalah mengekstrak informasi penting seperti nama produk, harga, dan peringkat dari halaman produk Amazon. Kami juga akan menunjukkan teknik untuk mengurai HTML secara efisien dan mengelola permintaan, memastikan ekstraksi data yang tepat dan terorganisir.
Untuk menjaga ketergantungan proyek dan menghindari konflik, disarankan untuk membuat lingkungan virtual yang terpisah untuk upaya scraping web ini. Menggunakan alat seperti "venv" atau "pyenv" direkomendasikan untuk menyiapkan lingkungan virtual.
Anda memerlukan pustaka Python pihak ketiga berikut ini:
Digunakan untuk mengirim permintaan HTTP dan mengambil konten web. Ini sering digunakan untuk mengikis web dan berinteraksi dengan API web.
Instalasi:
pip install requests
Perpustakaan untuk mengurai dan memanipulasi dokumen XML dan HTML. Ini sering digunakan untuk mengikis web dan bekerja dengan data terstruktur dari halaman web.
Instalasi:
pip install lxml
Di sini kita perlu mengimpor pustaka yang diperlukan agar scraper kita dapat berjalan. Termasuk di dalamnya adalah pustaka request untuk menangani permintaan HTTP, pustaka CSV untuk menangani operasi file CSV, pustaka random untuk menghasilkan nilai acak dan membuat pilihan acak, pustaka lxml untuk mem-parsing konten HTML mentah, dan Dict dan List untuk petunjuk tipe.
import requests
import csv
import random
from lxml import html
from typing import Dict, List
Cuplikan kode berikut ini membaca file CSV bernama amazon_product_urls.csv di mana setiap baris berisi URL halaman produk Amazon. Kode ini mengulang-ulang baris, mengekstrak URL dari setiap baris dan menambahkannya ke daftar bernama URL.
with open('amazon_product_urls.csv', 'r') as file:
reader = csv.DictReader(file)
for row in reader:
urls.append(row['url'])
Header permintaan memainkan peran penting dalam permintaan HTTP, menyediakan informasi klien dan permintaan yang kompleks. Saat melakukan scraping, penting untuk menyalin judul pengguna yang sah untuk menghindari deteksi dan dengan mudah mengakses informasi yang Anda inginkan. Dengan meniru header yang umum digunakan, scraper dapat menghindari teknik deteksi, memastikan bahwa data diekstrak secara konsisten sambil mempertahankan standar etika.
Proksi bertindak sebagai perantara dalam pengikisan web, menyembunyikan alamat IP pengikis untuk mencegah deteksi dan pemblokiran server. Proksi yang berputar memungkinkan Anda untuk mengirim setiap permintaan dengan alamat IP baru untuk menghindari potensi pemblokiran. Penggunaan proksi residensial atau seluler memperkuat ketahanan terhadap tindakan anti-scraping karena deteksi host dan penyedia yang sebenarnya.
Kode untuk mengintegrasikan header permintaan dan server proxy dengan otorisasi alamat IP:
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',
'sec-ch-ua': '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
proxies = {'http': '', 'https': ''}
Di sini, kita akan membuat daftar koleksi agen pengguna, yang darinya agen pengguna secara acak akan dipilih untuk setiap permintaan. Menerapkan mekanisme rotasi tajuk, seperti merotasi Agen-Pengguna setelah setiap permintaan, dapat membantu lebih lanjut dalam melewati langkah-langkah deteksi bot.
useragents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
"Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
]
headers['user-agent'] = random.choice(useragnets)
Mengirimkan permintaan HTTP GET ke URL tertentu dengan tajuk khusus, batas waktu 30 detik, dan proksi yang ditentukan untuk permintaan tersebut.
response = requests.get(url=url, headers=headers, proxies=proxies, timeout=30)
Poin data yang diperlukan: judul, harga, dan peringkat. Sekarang, mari kita periksa dan mengidentifikasi XPath yang sesuai untuk elemen yang ditunjukkan dalam tangkapan layar bersama dengan masing-masing poin data.
Tangkapan layar di bawah ini menunjukkan fitur Chrome DevTools "Inspect" yang digunakan untuk menemukan XPath `//span[@id="productTitle"]/text()` untuk mengekstrak judul produk dari halaman produk Amazon.
Tangkapan layar berikut ini menunjukkan temuan XPath `//div[@id="corePrice_feature_div"]/div/div/span/span/text()` untuk mengekstrak harga produk dari halaman produk Amazon.
Tangkapan layar menunjukkan temuan XPath `//span[@id="acrPopover"]/@title'` untuk mengekstraksi peringkat produk dari halaman produk Amazon.
Buat kamus yang menyediakan ekspresi XPath untuk mengekstrak informasi spesifik dari halaman web: judul, peringkat, dan harga produk.
xpath_queries = {'title': '//span[@id="productTitle"]/text()', 'ratings': '//span[@id="acrPopover"]/@title', 'price': '//span[@class="a-offscreen"]/text()'}
Kode di bawah ini menguraikan konten HTML yang diperoleh dari permintaan GET ke server Amazon ke dalam format seperti pohon yang terstruktur, sehingga memudahkan navigasi dan manipulasi elemen dan atributnya.
tree = html.fromstring(response.text)
Cuplikan kode berikut ini mengekstrak data dari pohon HTML yang diurai menggunakan kueri XPath dan menetapkannya ke kamus dengan kunci yang ditentukan. strip() digunakan untuk menghapus spasi di awal dan akhir jika ada. Fungsi ini mengambil hasil pertama dari kueri XPath dan menyimpannya di bawah kunci yang diberikan dalam kamus extracted_data.
data = tree.xpath(xpath_query)[0].strip()
extracted_data[key] = data
Kode berikut ini menulis data dari kamus extracted_data ke file CSV bernama product_data.csv. Pastikan bahwa baris header ditulis hanya jika file kosong. Jika file tidak kosong, maka akan menambahkan data sebagai baris tambahan ke file CSV. Fungsi ini memungkinkan file CSV terus diperbarui dengan data baru yang diekstrak tanpa menimpa teks yang sudah ada.
csv_file_path = 'product_data.csv'
fieldnames = ['title', 'ratings', 'price']
with open(csv_file_path, 'a', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if csvfile.tell() == 0:
writer.writeheader()
writer.writerow(extracted_data)
Silakan lihat kode lengkap kami, yang akan membantu Anda memulai dengan cepat. Kode ini terstruktur dan terdokumentasi dengan baik, sehingga mudah digunakan oleh pemula. Untuk menjalankan kode ini, pengguna harus memiliki file CSV bernama "amazon_product_urls" di direktori yang sama. Di bawah ini adalah struktur file CSV:
import requests
import csv
import random
from lxml import html
from typing import Dict, List
def send_requests(
url: str, headers: Dict[str, str], proxies: Dict[str, str]
) -> List[Dict[str, str]]:
"""
Mengirimkan permintaan HTTP GET ke beberapa URL dengan header dan proxy.
Args:
urls (str): URL untuk mengirim permintaan.
headers (Dict[str, str]): Kamus yang berisi tajuk permintaan.
proxies (Dict[str, str]): Kamus yang berisi pengaturan proxy.
Returns:
Response: Objek respons yang berisi data respons untuk setiap URL.
"""
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
# Validasi respons
if len(response.text)> 10000:
return response
return None
except Exception as e:
print(f"Error occurred while fetching URL {url}: {str(e)}")
def extract_data_from_html(
response, xpath_queries: Dict[str, str]
) -> Dict[str, List[str]]:
"""
Mengekstrak data dari konten HTML menggunakan kueri XPath.
Args:
response (Response): Objek Tanggapan.
xpath_queries (Dict[str, str]): Kamus yang berisi kueri XPath untuk ekstraksi data.
Returns:
Dict[str, str]: Kamus yang berisi data yang diekstrak untuk setiap kueri XPath.
"""
extracted_data = {}
tree = html.fromstring(response.text)
for key, xpath_query in xpath_queries.items():
data = tree.xpath(xpath_query)[0].strip()
extracted_data[key] = data
return extracted_data
def save_to_csv(extracted_data: Dict[str, any]):
"""
Menyimpan kamus sebagai baris dalam file CSV menggunakan DictWriter.
Args:
extracted_data (Dict[str, any]): Kamus yang mewakili deretan data.
"""
csv_file_path = "product_data.csv"
fieldnames = ["title", "ratings", "price"]
with open(csv_file_path, "a", newline="") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if csvfile.tell() == 0:
writer.writeheader() # Tulis header hanya jika file kosong
writer.writerow(extracted_data)
def main():
# Membaca URL dari file CSV
urls = []
with open("amazon_product_urls.csv", "r") as file:
reader = csv.DictReader(file)
for row in reader:
urls.append(row["url"])
# Mendefinisikan tajuk permintaan
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",
"sec-ch-ua": '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"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/123.0.0.0 Safari/537.36",
}
useragents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
"Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
]
# Mendefinisikan proksi
proxies = {"http": "IP:Port", "https": "IP:Port"}
# Mengirim permintaan ke URL
for url in urls:
# Rotasi agen pengguna di header
headers["user-agent"] = random.choice(useragnets)
response = send_requests(url, headers, proxies)
if response:
# Mengekstrak data dari konten HTML
xpath_queries = {
"title": '//span[@id="productTitle"]/text()',
"ratings": '//span[@id="acrPopover"]/@title',
"price": '//span[@class="a-offscreen"]/text()',
}
extracted_data = extract_data_from_html(response, xpath_queries)
# Menyimpan data yang diekstrak ke file CSV
save_to_csv(extracted_data)
if __name__ == "__main__":
main()
Solusi proxy yang berbeda, termasuk Datacenter IPv4, proxy seluler, ISP, dan residensial yang berotasi, tersedia untuk ekstraksi data tanpa gangguan. Logika rotasi dan agen pengguna yang tepat digunakan untuk mensimulasikan perilaku pengguna yang sebenarnya, sementara proxy khusus mendukung penggalian skala besar dengan rotasi internal dan kumpulan IP yang luas. Memahami pro dan kontra dari setiap opsi proksi sangat penting untuk ekstraksi data tanpa gangguan.
Jenis | Kelebihan | Kekurangan |
---|---|---|
Proksi Pusat Data |
Kecepatan dan kinerja tinggi. Hemat biaya. Ideal untuk permintaan volume besar. |
Dapat dengan mudah dideteksi dan dimasukkan ke dalam daftar hitam. Tidak dapat diandalkan untuk melawan sistem anti-scraping atau anti-bot. |
Proksi Perumahan |
Legitimasi yang tinggi karena IP hunian yang nyata. Ketersediaan IP global yang luas untuk penggalian data spesifik lokasi. Kemampuan rotasi IP. |
Lebih mahal daripada proksi pusat data. |
Proksi Seluler |
IP yang sangat sah. Efektif untuk menghindari pemblokiran dan permintaan verifikasi. |
Lebih mahal daripada jenis proxy lainnya. Lebih lambat daripada proxy pusat data karena ketergantungan pada jaringan seluler. |
Proksi ISP |
IP yang sangat andal. Lebih cepat dari IP perumahan. |
Ketersediaan IP yang terbatas. Rotasi IP tidak tersedia. |
Mengikis data produk dari Amazon melibatkan persiapan yang cermat untuk menavigasi mekanisme anti-scraping platform secara efektif. Memanfaatkan server proxy bersama dengan Python memungkinkan pemrosesan data yang efisien dan ekstraksi yang ditargetkan dari informasi yang diperlukan. Ketika memilih proxy untuk web scraping, sangat penting untuk mempertimbangkan faktor-faktor seperti kinerja, biaya, keandalan server, dan persyaratan spesifik proyek Anda. Menggunakan proksi dinamis dan menerapkan strategi untuk menangkal langkah-langkah keamanan dapat meminimalkan risiko diblokir dan meningkatkan efisiensi proses scraping secara keseluruhan.
Komentar: 0