Solusi crawling website dari Forbidden 403

By | July 27, 2022
Print Friendly, PDF & Email
133 Views

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

  1. Mechanize
  2. Request

Walaupun sudah dimodifikasi header agent nya Akan tetapi hasil tetap restriction

Package Mechanize

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

See also  Pandas Basics Cheat Sheet untuk Data Science

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

  1. Install gecko driver dilanjtukan set path
  2. 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

Leave a Reply

Your email address will not be published.




Enter Captcha Here :