Membuat Web Scraper Shopee Dengan Python
Banyak sekali aplikasi berbayar untuk scraping produk shopee.co.id, kalian juga bisa membuat aplikasi seperti itu sendiri lho!
Yang kita butuhkan dan gunakan :
- Python sudah terinstall di komputer kalian
- Chromedriver sesuai OS dan versi chrome kalian https://chromedriver.chromium.org/downloads
- Module bs4 untuk parsing html (pip install beautifulsoup4)
Proses scraper kita nanti adalah
- Membuka halaman pencarian langsung dengan kata kunci, misalnya https://shopee.co.id/search?keyword=sepatu%20converse
- Cari semua link ke setiap produk yang ada di hasil pencarian
- Kunjungi link setiap produk yang ada di halaman pencarian
- Terakhir kita ambil data-data yang kita perlukan dari setiap produk
Mari kita mulai!
Buat folder baru yang berisi file Chromedriver dan buat file bernama shopee.py
yang berisi kode kita nantinya, mari kita mulai!
Buka link https://shopee.co.id/search?keyword=sepatu%20converse dengan Google Chrome lalu aktifkan Developer Tool dengan menekan tombol CTRL + SHIFT = l
Kita perlu mencari link kesetiap produk yang ada di hasil pencarian, dari inspect element kita tahu kalau semua hasil pencarian produk shopee ada di dalam class row shopee-search-item-result__items
lalu kita hanya perlu mengambil semua tags href
yang ada di class tersebut
# shopee.py
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import csv
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
import time
chrome_options = Options()
# chrome_options.add_argument('--headless')
chrome_options.add_argument('log-level=2')
driver = webdriver.Chrome('./chromedriver', options=chrome_options)
katakunci = input('Masukkan kata kunci : ')
def search(katakunci):
links = []
print('mencari semua product dengan kata kunci ' + katakunci)
url = 'https://shopee.co.id/search?keyword=' + katakunci
try:
driver.get(url)
time.sleep(5)
driver.execute_script('window.scrollTo(0, 1500);')
time.sleep(5)
driver.execute_script('window.scrollTo(0, 2500);')
time.sleep(5)
soup_a = BeautifulSoup(driver.page_source, 'html.parser')
products = soup_a.find('div', class_='row shopee-search-item-result__items')
for link in products.find_all('a'):
links.append(link.get('href'))
print(link.get('href'))
except TimeoutException:
print('failed to get links with query ' + line)
return links
product_urls = search(katakunci)
Kita coba jalankan kode di atas maka hasilnya akan seperti dibawah
Kita sudah berhasil Mendapatkan link ke setiap produk, sekarang kita buat kode untuk scraping detail produknya, sebagai permulaan kita akan mengambil data nama produk, harga, deskripsi.
Seperti sebelumnya, kita harus mendapatkan setiap element yang kita butuhkan menggunakan Developer Tool dari Google chrome.
Dari hasil inspect element kita tahu kalau nama produk menggunakan class qaNIZv
atau bisa juga dengan span OSgLcw
, harga menggunakan class _3n5NQx
deskripsi menggunakan class _2u0jt9
Selanjutnya buat fungsi baru dengan nama get_product untuk scraping detail produk
# shopee.py
def get_product(produt_url):
try:
url = 'https://shopee.co.id' + produt_url
driver.get(url)
time.sleep(3)
driver.execute_script('window.scrollTo(0, 1500);')
time.sleep(3)
WebDriverWait(driver, timeout).until(
EC.visibility_of_element_located((By.CLASS_NAME, 'OSgLcw')))
soup_b = BeautifulSoup(driver.page_source, 'html.parser')
title = soup_b.find('span', class_='OSgLcw').text
price = soup_b.find('div', class_='_3n5NQx').text
try:
image = soup_b.find('div', class_='_2JMB9h _3XaILN')['style']
imgurl = re.findall('url\((.*?)\)', image)
except:
imgurl = 'none'
desc = soup_b.find('div', class_='_2u0jt9').text
print('Scraping ' + title)
# kita simpan hasil scraping ke file sresult.csv
with open('sresult.csv','a', encoding='utf-8',newline='') as f:
writer=csv.writer(f)
writer.writerow([title,price,url,desc,imgurl])
except TimeoutException:
print('cant open the link')
Kode akhir kita akan seperti di bawah ini
# shopee.py
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import csv
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
import time
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('log-level=2')
driver = webdriver.Chrome(options=chrome_options)
katakunci = input('Masukkan kata kunci : ')
def search(katakunci):
links = []
print('mencari semua product dengan kata kunci ' + katakunci)
url = 'https://shopee.co.id/search?keyword=' + katakunci
try:
driver.get(url)
time.sleep(5)
driver.execute_script('window.scrollTo(0, 1500);')
time.sleep(5)
driver.execute_script('window.scrollTo(0, 2500);')
time.sleep(5)
soup_a = BeautifulSoup(driver.page_source, 'html.parser')
products = soup_a.find('div', class_='row shopee-search-item-result__items')
for link in products.find_all('a'):
links.append(link.get('href'))
print(link.get('href'))
except TimeoutException:
print('failed to get links with query ' + line)
return links
def get_product(produt_url):
try:
url = 'https://shopee.co.id' + produt_url
driver.get(url)
time.sleep(3)
driver.execute_script('window.scrollTo(0, 1500);')
time.sleep(3)
WebDriverWait(driver, timeout).until(
EC.visibility_of_element_located((By.CLASS_NAME, 'OSgLcw')))
soup_b = BeautifulSoup(driver.page_source, 'html.parser')
title = soup_b.find('span', class_='OSgLcw').text
price = soup_b.find('div', class_='_3n5NQx').text
try:
image = soup_b.find('div', class_='_2JMB9h _3XaILN')['style']
imgurl = re.findall('url\((.*?)\)', image)
except:
imgurl = 'none'
desc = soup_b.find('div', class_='_2u0jt9').text
print('Scraping ' + title)
with open('result.csv','a', encoding='utf-8',newline='') as f:
writer=csv.writer(f)
writer.writerow([title,price,url,desc,imgurl])
except TimeoutException:
print('cant open the link')
products_urls = search(katakunci)
for product_url in products_urls:
get_product(product_url)
driver.quit()
Permasalahan
Shopee sering mengubah nama class untuk element-element di atas. jika kode di atas tidak berkerja maka kalian perlu mendapatkan nama class baru dari shopee
Need TODO
Akan sedikit ribet kalau kita harus menjalankan kode di atas dengan CMD / Terminal, kalian bisa menjadikan kode di atas menjadi executable atau file exe jadi nanti tinggal double click saja untuk membuka program kita di atas.
Mudah bukan? Selamat mencoba!