Banyak sekali aplikasi berbayar untuk scraping produk shopee.co.id, kalian juga bisa membuat aplikasi seperti itu sendiri lho!

Yang kita butuhkan dan gunakan :

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)
timeout = 10
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.

Buka link https://shopee.co.id/Sepatu-Sneakers-Premium-Converse-CT-All-Star-Pria-Cowok-Sepatu-Casual-Sepatu-Santai-Terbaru-i.105928938.7555060579

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)

timeout = 10
def selectlang():
    driver.get('https://shopee.com.my')
    WebDriverWait(driver, timeout).until(
        EC.visibility_of_element_located(
            (By.XPATH, '//*[@id="modal"]/div[1]/div[1]/div/div[3]/div[1]/button')))
    driver.find_element_by_xpath('//*[@id="modal"]/div[1]/div[1]/div/div[3]/div[1]/button').click()

def search():
    links = []
    selectlang()
    with open('query.txt', 'r') as f:
        for line in f.read().splitlines():
            print('searching products with query ' + line)
            url = 'https://shopee.com.my/search?keyword=' + line
            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.com.my' + 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')

product_urls = search()

for product_url in product_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!