
Ngomongin masalah crawling/scrapper isi website untuk mendapatkan data yang kita butuhkan terkadang pihak yang punya server memberikan akses terbatas karena nggak mau server dicrawling begitu saja. Salah satunya yaitu server milik https://www.idx.co.id untuk mendapatkan ringkasan harga saham harian.
Crawling/Scrapper dilakukan jika pihak server tidak menyediakan API khusus walaupun begitu dengan sedikit trik, kita bisa kok mendapatkan API untuk akses respond server yang biasanya menghasilkan JSON/XML.
Package jsonlite pada R/RStudio sangat bisa diandalkan untuk narik data pada sebuah website, namun ada server-server tertentu yang restriction 403 ketika diakses menggunakan jsonlite yang pernah saya bahas di Dapat Cuan dari Emiten Gocap. Saya pikir ada masalah dengan SSL. Hal yang kurang pada package JSONLITE tidak adanya argument user-agent sehingga saya menggunakan Python dengan package berikut
- Mechanize
- Request
Walaupun sudah dimodifikasi header agent nya Akan tetapi hasil tetap restriction
Package Mechanize
Contents
Package mechanize banyak digunakan untuk melakukan scrapping yang melibatkan proses form login. Berikut kode dengan user-agent yang ditambahkan
import mechanize url_master = ("https://www.idx.co.id/umbraco/Surface/"+ "TradingSummary/GetStockSummary?Length=10000&date=20220721") op = mechanize.Browser() # use mecahnize's browser op.set_handle_equiv(True) op.set_handle_gzip(True) op.set_handle_redirect(True) op.set_handle_referer(True) op.set_handle_robots(False) op.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] op.set_handle_robots(False) #tell the webpage you're not a robot op.open(url_master)
Response yang didapat yaitu
httperror_seek_wrapper: Forbidden
Seperti yang dilihat diatas, server menolak karena sudah terdeteksi bot
Package request
Package request juga bisa digunakan untuk akses website digabungkan dengan beautifulsoap sebagai parser HTML nya.
import requests url_master = ("https://www.idx.co.id/umbraco/Surface/"+ "TradingSummary/GetStockSummary?Length=10000&date=20220721") headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"} #1. menggunakan request response = requests.get(url_master,headers=headers) print(response.text)
Response yang didapat yaitu
You do not have access to www.idx.co.id.</p><p>The site owner may have set restrictions that prevent you from accessing the site. Contact the site owner for access or try loading the page again.
Ternyata tetap tidak bisa karena ketika akses dipastikan sebagai BOT
Solusi crawling/scrapper website Forbidden 403
Ternyata setelah cari-cari belum ada solusi untuk package diatas agar server tidak mengenali sebagai bot. Solusi crawling/scrapper website dari Forbidden 403 bisa kita akan dengan menggunakan selenium dan gecko driver. Urutan install yaitu
- Install gecko driver dilanjtukan set path
- Install selenium via pip
Gecko driver merupakan webdriver yang bekerja selayaknya peramban, kalian bisa download https://github.com/mozilla/geckodriver/releases dan lakukan set path nya agar dikenali oleh system.
Berikut ketika saya panggil di command prompt
C:\Users\User>geckodriver 1658663341151 geckodriver INFO Listening on 127.0.0.1:4444
Mengingat gecko driver berupa open source dan disediakan untuk beragam OS seperti linux, mac OS, dan windows.
Bila kalian pengguna Mac OS, silahkan untuk set path seperti https://medium.com/dropout-analytics/selenium-and-geckodriver-on-mac-b411dbfe61bc
Kemudian lanjutkan install selenium melalui perintah pip pip install selenium
https://selenium-python.readthedocs.io/installation.html
Mendapatkan ID HTML
Kita bahas dulu mengenai respond dari alamat URL diatas
https://www.idx.co.id/umbraco/Surface/TradingSummary/GetStockSummary?Length=10000&date=20220721
Menghasilkan page source yang didalamnya ada id=rawdata
<div id="rawdata-panel" style="visibility: hidden; height: 0px;" class="tab-panel-box hidden" role="tabpanel" aria-labelledby="rawdata-tab"></div>
Sekarang kita panggil selayaknya membuka browser firefox melalui klik mouse
from selenium import webdriver import json import pandas as pd driver = webdriver.Firefox() driver.get(url_master) button = driver.find_element_by_id("rawdata-tab") button.click() data = driver.find_element_by_class_name("data").text d = json.loads(data) final = pd.DataFrame(d["data"]) final.to_csv("20220721.csv")
Akhirnya menggunakan selenium, kita bisa membuat bot untuk menyimpan JSON dari website menjadi Solusi crawling/scrapper website dari Forbidden 403.
key :
Stock Market Bot