Apakah kalian pernah melakukan scraping website dan server tersebut menolak karena terdeteksi sebuah bot. Bahkan kalian sudah banyak modifikasi User Agent agar mirip browser, namun tetap saja ketahuan bahwa itu adalah bot. Saya pernah menggunakan mechanize, playwright, cloudscraper
dengan pesan khas dari server: HTTP Error 403: Forbidden
Modifikasi seperti
import mechanize
def scraping(url):
br = mechanize.Browser()
br.set_handle_robots(False)
br.set_handle_refresh(False)
br.addheaders = [
('User-Agent',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/120.0.0.0 Safari/537.36'),
('Accept',
'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
('Accept-Language', 'en-US,en;q=0.5'),
('Connection', 'keep-alive'),
]
response = br.open(url)
html = response.read()
return html.decode("utf-8")
atau menggunakan playwright
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(url_master)
html = page.content()
browser.close()
atau menggunakan cloudscraper
import cloudscraper
scraper = cloudscraper.create_scraper(
browser={
"browser": "chrome",
"platform": "mac",
"desktop": True
}
)
html = scraper.get(url).text
Semuanya akan gagal!
Kenapa server tahu itu bot?
Karena mechanize itu “telanjang” secara fingerprint. Bahkan kalau kamu ganti User-Agent, server tetap bisa tahu dari banyak sinyal lain. Yang dicek server (Cloudflare / WAF modern)
Mechanize gagal di hampir semua poin ini:
-
Tidak ada JavaScript execution
-
Tidak ada browser fingerprint
-
Header HTTP tidak lengkap
-
TLS fingerprint berbeda dari browser asli
-
Cookie challenge tidak dieksekusi
-
Behavior tidak manusiawi (langsung GET halaman target)
Solusinya pakai selenium
Berbasis chromium sehingga kita memerintah kan chrome mengikuti apa yang kita mau, kalau kalian menggunakan OS ubuntu bisa menggunakan perintah beriktu
sudo apt install chromium-chromedriver
terus kita bisa pakai script berikut
from selenium import webdriver driver = webdriver.Chrome() driver.get(url_master) # misalkan kita membuka website yang mengembalikan JSON pre = driver.find_element(By.TAG_NAME, "pre") json_data = json.loads(pre.text) final = pd.DataFrame(json_data["data"])
dengan cara diatas, maka chrome akan terbuka dan langsung menuju URL yang kita maksud tanpa terdeteksi sebagai bot!