Beranda BlogPengikisan web Web Scraping Walmart dengan Python: Pahami cara mengikis data dengan cepat dan mudah

Web Scraping Walmart dengan Python: Pahami cara mengikis data dengan cepat dan mudah

oleh Kadek

Dalam tutorial ini, kita akan menggunakan Python untuk mengekstrak data produk dari situs Walmart. Kami akan mengeksplorasi berbagai cara untuk menguraikan dan mengekstrak data yang Anda perlukan, dan mendiskusikan beberapa potensi tantangan yang ada Pengikisan web terhubung.

Mengapa menghapus data produk Walmart?

Walmart menawarkan berbagai macam produk di toko online-nya, menjadikannya kandidat ideal untuk proyek web scraping. Dengan menggunakan teknik web scraping, Anda dapat mengotomatiskan pengumpulan data produk seperti harga, ketersediaan, gambar, deskripsi, peringkat, ulasan, dan lainnya. Anda kemudian dapat menggunakan data ini dalam aplikasi atau proyek analisis Anda.

Pengantar Pengikisan Walmart

Untuk mengekstrak data produk, Anda harus menganalisisnya terlebih dahulu. Mari kita lihat halaman produk - semuanya memiliki tipe yang sama, dan setelah menganalisisnya, Anda dapat mengekstrak data web yang Anda perlukan menggunakan skrip tertulis.


Halaman produk Walmart
Halaman produk Walmart

Kami tertarik pada area pengikisan berikut:

  1. Nama Produk
  2. Harga produk
  3. Jumlah ulasan
  4. Evaluasi
  5. Gambar utama

Tentu saja, Anda mungkin memerlukan bidang lain dengan data lain untuk tujuan tertentu seperti deskripsi atau merek, namun kami hanya akan mempertimbangkan data produk utama dalam contoh ini. Detail lainnya dapat diekstraksi dengan cara yang sama. Sebagai contoh, mari kita buat scraper yang mengumpulkan link dari file CSV, mengikuti setiap link, dan menyimpan data yang dihasilkan ke file lain. Baca juga tentang itu cURL ke Python.

Anda juga dapat mengumpulkan URL produk dari halaman dan kategori menggunakan skrip untuk mengumpulkan semua produk. Namun, kami tidak akan membahasnya dalam panduan ini. Kami sebelumnya menerbitkan artikel tentang mengambil data dari Amazon dan memeriksa cara mengatur transisi ke halaman hasil pencarian dan mengumpulkan semua tautan produk. Hal serupa dapat dilakukan untuk Walmart.

Mengekstraksi data cukup bermasalah di Walmart, karena perusahaan tidak mendukung pengikisan produk dan memiliki sistem anti-spam. Melacak dan memblokir alamat IP kemungkinan akan memblokir sebagian besar pengikis yang mencoba mengakses situs web Anda. Oleh karena itu, sebelum kita membuat scraper Walmart dengan Python, perhatikan bahwa saat menulis scraper Anda sendiri, Anda juga harus berhati-hati dalam melewati blok.

Jika tidak ada kesempatan atau waktu untuk mengatur sistem bypass kunci, Anda dapat mengikis data menggunakan API web scraping, yang memecahkan masalah ini. Anda dapat mengetahui lebih lanjut tentang cara mencari Walmart menggunakan API kami di akhir artikel.

Menginstal perpustakaan Python untuk scraping

Sebelum kita mencari item untuk dikikis, mari buat file Python dan tambahkan perpustakaan yang diperlukan. Kami akan menggunakan:

  1. Pustaka Permintaan untuk menjalankan permintaan.
  2. Pustaka BeautifulSoup untuk menyederhanakan penguraian halaman web.

Jika Anda tidak memiliki perpustakaan BeautifulSoup (perpustakaan permintaan sudah ada di dalamnya), gunakan perintah berikut pada baris perintah:

pip install beautifulsoup4

Masukkan perpustakaan ini ke dalam file Python:

from bs4 import BeautifulSoup
import requests

Mari kita membuat atau menghapus (menimpa) file tempat kita menyimpan data Walmart. Beri nama file ini result.csv dan tentukan kolom di dalamnya:

with open("result.csv", "w") as f:
  f.write("title; price; rating; reviews; image\n")

Selanjutnya buka file links.csv yang menyimpan link ke halaman produk yang kita telusuri. Kami akan membahas semuanya secara berurutan dan melakukan pemrosesan data untuk masing-masingnya. Kode berikut akan melakukannya:

with open("links.csv", "r+") as links:
  for link in links:

Sekarang kita mendapatkan semua kode halaman yang akan terus kita kerjakan dan menganalisisnya menggunakan BeautifulSoup:

	html_text = requests.get(link).text
    	soup = BeautifulSoup(html_text, 'lxml')

Pada titik ini kita sudah memiliki kode halaman produk dan dapat menampilkannya menggunakan, misalnya, print(soup).

Cara 1. Analisis teks halaman

Untuk memilih hanya informasi yang diperlukan, kami menganalisis halaman untuk menemukan penyeleksi dan atribut yang menggambarkan data penting dengan jelas.

Mari buka situs web Walmart dan lihat halaman produk lagi. Yuk cari judul produknya dulu. Untuk melakukan ini, buka DevTools (F12) dan temukan kode item (Ctrl + Shift + C dan pilih item):


Pemilihan judul produk
Pemilihan judul produk

Dalam hal ini berada di <h1> Tag dan atribut itempropnya memiliki nilai “name“. Mari masukkan nilai teks yang disimpan dalam tag ini ke dalam variabel judul:

title = soup.find('h1', attrs={'itemprop': 'name'}).text

Mari kita lakukan hal yang sama, tapi sekarang untuk harganya:


Pemilihan harga produk
Pemilihan harga produk

Dapatkan kontennya <span> Tag dengan nilai atribut itemprop sama dengan “price„:

  price = soup.find('span', attrs={'itemprop': 'price'}).text

Untuk verifikasi dan evaluasi, analisis dilakukan dengan cara yang sama, maka kita tuliskan hasil akhirnya:

    reviews = soup.find('a', attrs={'itemprop': 'ratingCount'}).text
    rating = soup.find('span', attrs={'class': 'rating-number'}).text

Semuanya sedikit berbeda dalam gambar. Mari kita lihat halaman produk dan kode item:


Pemilihan gambar produk
Pemilihan gambar produk

Kali ini Anda perlu mendapatkan nilai atribut src yang disimpan di file <img> hari dengan “db“Atribut kelas dan muatan sama”eager“. Berkat perpustakaan BeautifulSoup, ini menjadi mudah:

image = soup.find('img', attrs={'class': 'db','loading': 'eager'})("src")

Kita harus ingat bahwa dalam kasus ini tidak setiap halaman akan mengembalikan gambar tersebut. Oleh karena itu, lebih baik menggunakan informasi dari meta tag:

image = soup.find('meta', property="og:image")("content")

Jika kita mulai dengan variabel di atas, kita mendapatkan detail produk berikut:

Canon EOS Rebel T100 Digital SLR Camera with 18-55mm Lens Kit, 18 Megapixel Sensor, Wi-Fi, DIGIC4+, SanDisk 32GB Memory Card and Live View Shooting
Now $299.00
172 reviews
(4.5)
https://i5.walmartimages.com/asr/ce0f57f7-ad6f-4e0b-a7ae-f751068597c2_1.b7e1f1bab1fd7f98cb9aef1ae9b783fb.png

Mari simpan data yang diterima ke file yang dibuat/dihapus sebelumnya:

    try:
        with open("result.csv", "a") as f:
            f.write(str(title)+"; "+str(price)+"; "+str(reviews)+"; "+str(rating)+"; "+str(image)+"\n")
    except Exception as e:
        print("There is no data")

Disarankan untuk melakukan ini di blok try…exclusive, karena jika tidak ada data atau tautan tidak ditentukan dengan benar, eksekusi program akan terganggu. Anda dapat menggunakan blok try…exclusive untuk “menangkap” kesalahan tersebut, melaporkannya, dan melanjutkan program.

Saat Anda menjalankan program ini, data yang tergores akan disimpan dalam file result.csv:


Di sini kita melihat beberapa masalah. Pertama, ada teks tambahan pada kolom Harga, Review, dan Rating. Kedua, jika ada diskon, kolom harga bisa saja menampilkan informasi yang salah atau dua harga.

Tentu saja, membiarkan ekspresi reguler hanya pada nilai numerik tidak menjadi masalah, tetapi mengapa mempersulit tugas jika ada cara yang lebih mudah?

Cara 2. Parsing data terstruktur JSON-LD

Jika Anda melihat lebih dekat pada kode halaman, Anda akan melihat bahwa semua informasi yang diperlukan disimpan tidak hanya di badan halaman. Mari kita perhatikan <head>…</head> hari, lebih tepatnya miliknya <script nonce type="application/ld+json">…</script> Label.


Markup skema “produk” Walmart dalam format JSON
Markup skema “produk” Walmart dalam format JSON

Ini adalah markup skema Produk dalam format JSON. Skema produk memungkinkan atribut produk tertentu ditambahkan ke daftar produk yang dapat ditampilkan sebagai hasil kaya di halaman hasil mesin pencari (SERP). Mari kita salin dan format ke dalam bentuk yang nyaman untuk penelitian:

{ &quot;@context&quot;: &quot;https://schema.org&quot;, &quot;@type&quot;: &quot;Produk&quot;, &quot;image&quot;: &quot;https://i5.walmartimages.com/asr/ce0f57f7-ad6f-4e0b-a7ae- f751068597c2_1.b7e1f1bab1fd7f98cb9aef1ae9b783fb.png&quot;, &quot;name&quot;: &quot;Kamera SLR Digital Canon EOS Rebel T100 dengan Kit Lensa 18-55mm, Sensor 18 Megapiksel, Wi-Fi, DIGIC4+, Kartu Memori SanDisk 32GB dan Pemotretan Live View&quot;, &quot;sku&quot;: &quot;771229626&quot;, &quot;gtin13&quot;: &quot;013803300550&quot;, &quot;deskripsi&quot;: &quot;<p>Membuat cerita khas dengan foto berkualitas DSLR dan film Full HD lebih mudah dari yang Anda kira dengan Canon EOS Rebel T100 18 Megapiksel. Bagikan secara instan dan potret dari jarak jauh melalui ponsel cerdas Anda yang kompatibel dengan Wi-Fi dan aplikasi Canon Camera Connect. Sensor 18 Megapiksel yang kuat memiliki luas permukaan hingga 19 kali lebih luas dibandingkan kebanyakan ponsel cerdas, dan Anda dapat langsung mentransfer foto dan film ke perangkat pintar Anda. Canon EOS Rebel T100 memiliki fitur Scene Intelligent Auto yang memungkinkan Anda membingkai dan memotret dengan mudah untuk hasil yang luar biasa. Ia juga dilengkapi pemotretan Guided Live View dengan mode Creative Auto, dan Anda dapat menambahkan hasil akhir yang unik dengan Creative Filters. Canon EOS Rebel T100 menjadikannya cepat dan mudah untuk berbagi semua momen penting.</p>&quot;, &quot;model&quot;: &quot;T100&quot;, &quot;merek&quot;: { &quot;@type&quot;: &quot;Merek&quot;, &quot;nama&quot;: &quot;Canon&quot; }, &quot;penawaran&quot;: { &quot;@type&quot;: &quot;Penawaran&quot;, &quot;url&quot; : &quot;https://www.walmart.com/ip/Canon-EOS-Rebel-T100-Digital-SLR-Camera-with-18-55mm-Lens-Kit-18-Megapixel-Sensor-Wi-Fi-DIGIC4- SanDisk-32GB-Memory-Card-and-Live-View-Shooting/771229626&quot;, &quot;priceCurrency&quot;: &quot;USD&quot;, &quot;price&quot;: 299, &quot;availability&quot;: &quot;https://schema.org/InStock&quot;, &quot; itemCondition&quot;: &quot;https://schema.org/NewCondition&quot;, &quot;availableDeliveryMethod&quot;: &quot;https://schema.org/OnSitePickup&quot; }, &quot;review&quot;: ( { &quot;@type&quot;: &quot;Review&quot;, &quot;name&quot; : &quot;Kamera bagus untuk pemula&quot;, &quot;datePublished&quot;: &quot;4 Januari 2020&quot;, &quot;reviewBody&quot;: &quot;Suka kamera ini....&quot;, &quot;reviewRating&quot;: { &quot;@type&quot;: &quot;Rating&quot;, &quot;worstRating&quot; : 1, &quot;ratingValue&quot;: 5, &quot;bestRating&quot;: 5 }, &quot;penulis&quot;: { &quot;@type&quot;: &quot;Orang&quot;, &quot;nama&quot;: &quot;Sparkles&quot; } }, { &quot;@type&quot;: &quot;Ulasan&quot;, &quot;name&quot;: &quot;Sempurna untuk pemula&quot;, &quot;datePublished&quot;: &quot;7 Januari 2020&quot;, &quot;reviewBody&quot;: &quot;Saya sangat jatuh cinta dengan kamera ini!...&quot;, &quot;reviewRating&quot;: { &quot;@type&quot;: &quot;Rating&quot;, &quot;worstRating&quot;: 1, &quot;ratingValue&quot;: 5, &quot;bestRating&quot;: 5 }, &quot;author&quot;: { &quot;@type&quot;: &quot;Orang&quot;, &quot;name&quot;: &quot;Brazilchick32&quot; } }, { &quot;@ type&quot;: &quot;Review&quot;, &quot;name&quot;: &quot;Kamera hebat&quot;, &quot;datePublished&quot;: &quot;17 Januari 2020&quot;, &quot;reviewBody&quot;: &quot;Saya sangat menyukai semua fitur yang dimiliki kamera ini. Setiap kali saya menggunakannya, saya menemukan yang baru. Saya cukup tertantang secara teknologi, namun hal ini tidak menghalangi saya. Zoom dan fokus memberikan gambar yang sangat detail dan tajam. Saya tidak sabar untuk membawanya pada perjalanan saya berikutnya karena saat ini saya baru memotret anjing itu jutaan kali&quot;, &quot;reviewRating&quot;: { &quot;@type&quot;: &quot;Rating&quot;, &quot;worstRating&quot;: 1, &quot;ratingValue&quot;: 5 , &quot;bestRating&quot;: 5 }, &quot;penulis&quot;: { &quot;@type&quot;: &quot;Orang&quot;, &quot;nama&quot;: &quot;ramah pengguna&quot; } } ), &quot;aggregateRating&quot;: { &quot;@type&quot;: &quot;AggregateRating&quot;, &quot;ratingValue&quot; : 4.5, &quot;peringkat terbaik&quot;: 5, &quot;jumlah ulasan&quot;: 172 } }

Sekarang jelas bahwa informasi ini sudah cukup dan disimpan dalam bentuk yang lebih nyaman. Artinya, perlu untuk membaca isi dari <head>…</head> Tandai dan pilih tag yang menyimpan data di JSON. Kemudian atur variabel ke nilai berikut:

  1. nilai judul dari (name) Atribut.

  2. Nilai murah dari (offers)(price) Atribut.

  3. Ulasan nilai (aggregateRating)(reviewCount) Atribut.

  4. Nilai peringkat dari (aggregateRating)(ratingValue) Atribut.

  5. Nilai gambar dari (image) Atribut.

Untuk dapat bekerja dengan JSON, cukup menyertakan perpustakaan terintegrasi:

import json

Mari buat variabel data yang akan kita masukkan data JSON:

data = (json.loads(soup.find('script', attrs={'type': 'application/ld+json'}).text))

Setelah itu, kita memasukkan data ke dalam variabel yang sesuai:

    title = data('name')
    price = data('offers')('price')
    reviews = data('aggregateRating')('reviewCount')
    rating = data('aggregateRating')('ratingValue')
    image = data('image')

Sisanya tetap sama. Periksa eksekusi skrip:


Tabel hasil dengan data produk yang diekstraksi
Tabel hasil dengan data produk yang diekstraksi

Skrip lengkap:

from bs4 import BeautifulSoup
import requests
import json

with open("result.csv", "w") as f:
  f.write("title; price; rating; reviews; image\n")
with open("links.csv", "r+") as links:
  for link in links:
    html_text = requests.get(link).text
    soup = BeautifulSoup(html_text, 'lxml')
    data = (json.loads(soup.find('script', attrs={'type': 'application/ld+json'}).text))
    title = data('name')
    price = data('offers')('price')
    reviews = data('aggregateRating')('reviewCount')
    rating = data('aggregateRating')('ratingValue')
    image = data('image')
    try:
        with open("result.csv", "a") as f:
            f.write(str(title)+"; "+str(price)+"; "+str(reviews)+"; "+str(rating)+"; "+str(image)+"\n")
    except Exception as e:
        print("There is no data")

Perlindungan Anti-Bot Walmart

Namun, seperti yang disebutkan di awal artikel, layanan memantau aktivitas yang terlihat seperti bot, memblokirnya, dan menawarkan untuk memecahkan captcha. Jadi, alih-alih mendapatkan halaman berisi data, halaman lain akan ditampilkan:


Walmart “Tekan dan Tahan” CAPTCHA
Walmart “Tekan dan Tahan” CAPTCHA

Ini adalah saran untuk mengatasi captcha. Untuk menghindari hal ini, Anda harus mematuhi ketentuan yang dijelaskan sebelumnya.

Anda juga dapat menambahkan header ke kode, yang akan sedikit mengurangi kemungkinan pemblokiran:

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"}

Kemudian permintaannya terlihat sedikit berbeda:

    html_text = requests.get(link, headers=headers).text

Hasil pengeriknya:


Sayangnya, hal ini tidak selalu membantu menghindari penyumbatan. Di sinilah API web scraping berperan.

Kikis data produk Walmart menggunakan Web Scraping API

Mari kita lihat kasus penggunaan API web scraping yang menangani penghindaran pemblokiran. Bagian dari skrip yang dijelaskan sebelumnya tidak akan berubah. Kami hanya akan mengubahnya.

Buat akun scrape-it.cloud. Setelah itu Anda akan menerima 1.000 kredit. Anda memerlukan kunci API, yang dapat Anda temukan di akun Anda di bagian dasbor:


Kunci API Scrape-It.Cloud
Dapatkan kunci API Scrape-It.Cloud di dasbor

Kita juga memerlukan perpustakaan JSON, jadi mari tambahkan ke proyek:

import json

Sekarang kita menetapkan nilai API ke variabel URL dan menambahkan kunci API dan tipe konten di header:

url = "https://api.scrape-it.cloud/scrape"
headers = {
  'x-api-key': 'YOUR-API-KEY',
  'Content-Type': 'application/json'
}

Untuk menambahkan kueri dinamis:

   temp = """{
  "url": """+"\""+str(link)+"\""+""",
  "block_resources": False,
  "wait": 0,
  "screenshot": True,
  "proxy_country": "US",
  "proxy_type": "datacenter"
}"""
    payload = json.dumps(temp)
    response = requests.request("POST", url, headers=headers, data=payload)

Ambil data dalam “konten” yang menyimpan kode halaman Walmart:

html_text = json.loads(response.text)("scrapingResult")("content")

Mari kita lihat kode lengkapnya:

from bs4 import BeautifulSoup
import requests
import json

url = "https://api.scrape-it.cloud/scrape"
headers = {
  'x-api-key':  'YOUR-API-KEY',
  'Content-Type': 'application/json'
}

with open("result.csv", "w") as f:
  f.write("title; price; rating; reviews; image\n")
with open("links.csv", "r+") as links:
  for link in links:
    html_text = requests.get(link).text
    soup = BeautifulSoup(html_text, 'lxml')
    data = (json.loads(soup.find('script', attrs={'type': 'application/ld+json'}).text))
    title = data('name')
    price = data('offers')('price')
    reviews = data('aggregateRating')('reviewCount')
    rating = data('aggregateRating')('ratingValue')
    image = data('image')
    try:
        with open("result.csv", "a") as f:
            f.write(str(title)+"; "+str(price)+"; "+str(reviews)+"; "+str(rating)+"; "+str(image)+"\n")
    except Exception as e:
        print("There is no data")

Selain atribut yang ditentukan, atribut lain dapat ditentukan di isi permintaan. Cari tahu lebih lanjut di dokumentasi Atau cobalah di bawah tab Web Scraping API di akun Anda.


Mengikis Walmart menggunakan API
Mengikis Walmart menggunakan API

Anda dapat membuat permintaan secara visual dan kemudian menerima kode dalam salah satu bahasa pemrograman yang didukung.

Kesimpulan dan temuan

Menemukan dan mengambil data untuk eCommerce adalah tugas yang memakan waktu, terutama jika dilakukan secara manual. Sulit juga untuk mengetahui apakah data tersebut akurat dan objektif yang akan membantu Anda mengambil keputusan bisnis yang tepat.

Tanpa data berkualitas tinggi Sulit untuk mengembangkan dan menerapkan strategi pemasaran yang dibutuhkan bisnis Anda untuk tumbuh, sukses, dan memenuhi kebutuhan pelanggan. Hal ini juga dapat memengaruhi reputasi Anda karena Anda mungkin dianggap tidak dapat diandalkan jika pelanggan atau mitra Anda menganggap data Anda tidak dapat diandalkan.

Mengikis data produk Walmart dengan Python adalah cara terbaik untuk mengumpulkan informasi berharga dalam jumlah besar dengan cepat tentang produk yang tersedia di situs. Dengan menggunakan perpustakaan canggih seperti Beautiful Soup dan Selenium bersama dengan kueri atau regex XPath, pengembang dapat dengan mudah mengekstrak informasi spesifik dari halaman web mana pun yang mereka inginkan dan mengubahnya menjadi kumpulan data terstruktur yang dapat mereka gunakan dalam aplikasi atau proyek analisis mereka. Dan ketika Anda menggunakan web scraping API untuk mengotomatiskan proses pengumpulan data, Anda tidak perlu khawatir tentang pemblokiran, captcha, proksi, penggunaan header, dan banyak lagi.

Pos terkait

Tinggalkan Komentar