Idenya
Scraper adalah browser dengan autopilot: ia pergi ke halaman-halaman, mengikuti link, dan sesekali perlu menunjukkan kepadamu apa yang dilihatnya. Modul ini membahas cara berpindah-pindah di sebuah situs dengan andal (termasuk menyadari saat halaman gagal dimuat) dan screenshot, alat debugging terbaikmu.
goto mengembalikan response
Saat scraper mengunjungi ratusan halaman produk, sebagian di antaranya pasti sudah tidak ada. Manusia akan langsung menyadari pesan "Not found", tapi script tidak akan tahu kecuali kamu mengeceknya. goto memberimu response dari server, jadi kamu bisa mengeceknya:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
response = page.goto("https://nusantara-gadget.test/product/3")
print(response.status, response.ok)
print(page.url)
print(page.title())
missing = page.goto("https://nusantara-gadget.test/product/999")
print(missing.status, missing.ok)
print(page.title())
browser.close()
200 True
https://nusantara-gadget.test/product/3
iPhone 15 — Nusantara Gadget
404 False
Not found
page.goto mengembalikan response dari dokumen utama. Browser dengan senang hati menampilkan halaman "Not found", jadi tanpa mengecek status, scraper-mu akan terus berjalan dan men-scrape halaman error seolah-olah itu sebuah produk. Cek response.ok (status di bawah 400) atau response.status setelah setiap navigasi yang penting.
Mengikuti link dan berpindah-pindah
Pengguna sungguhan mengklik link; scraper-mu juga bisa. Mengklik link melakukan navigasi, dan page.url memberitahumu di mana kamu berakhir:
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://nusantara-gadget.test/")
page.get_by_role("link", name="Laptops").click()
print(page.url)
print(page.title())
page.go_back()
print(page.url)
page.reload()
print(page.title())
browser.close()
https://nusantara-gadget.test/products?category=laptops
Products — page 1 — Nusantara Gadget
https://nusantara-gadget.test/
Nusantara Gadget — Official Gadget Store
click()pada link melakukan navigasi dan menunggu halaman baru.go_back()danreload()bekerja seperti tombol browser (go_forward()juga ada).page.urlselalu berisi alamat saat ini, termasuk query string-nya.
(get_by_role menemukan elemen dengan cara manusia mendeskripsikannya, "link bernama Laptops". Modul 4 membahasnya dengan tuntas.)
Link relatif
Link di HTML sering kali relatif (/product/3, ?page=2). page.goto me-resolve-nya terhadap halaman saat ini, persis seperti browser:
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://nusantara-gadget.test/products")
page.goto("/products?page=2")
print(page.url)
browser.close()
https://nusantara-gadget.test/products?page=2
Saat kamu membangun URL sendiri di Python, urllib.parse.urljoin(page.url, href) melakukan hal yang sama.
Screenshot
Saat scraper berulah, pertanyaan tercepat untuk dijawab adalah "seperti apa sebenarnya halaman itu?":
import os
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://nusantara-gadget.test/products")
page.screenshot(path="products.png") # the visible window
page.screenshot(path="products_full.png", full_page=True) # the whole scrollable page
page.locator(".product-card").first.screenshot(path="first_card.png") # one element
browser.close()
print(sorted(f for f in os.listdir(".") if f.endswith(".png")))
['first_card.png', 'products.png', 'products_full.png']
path=menyimpan PNG; tanpanya,screenshot()mengembalikan byte gambarnya.full_page=Truemenangkap seluruh halaman, bukan hanya bagian yang terlihat.locator(...).screenshot()menangkap satu elemen saja.
Kebiasaan yang berguna: di penanganan error scraper-mu, simpan screenshot yang diberi nama sesuai URL yang gagal. Saat ada yang rusak jam 3 pagi, gambarnya biasanya menjelaskan masalahnya dalam hitungan detik.
Cek response.ok setelah goto; bernavigasi dengan mengklik link atau dengan goto (URL relatif juga bisa); gunakan page.url untuk memastikan posisimu; ambil screenshot setiap kali kamu perlu melihat apa yang dilihat scraper.
wait_until: kapan halaman dianggap "termuat"?
goto secara default menunggu event load: HTML, CSS, script, dan gambar sudah masuk. Ia tidak menunggu data yang diambil JavaScript setelahnya (katalog dari modul 1). Pilihannya:
wait_until= | Menunggu |
|---|---|
"load" (default) | HTML dan resource-nya |
"domcontentloaded" | HTML selesai di-parse saja (lebih cepat) |
"networkidle" | tidak ada network request selama 500 ms (lambat, gunakan seperlunya) |
Untuk konten yang dimuat JavaScript, lebih baik menunggu elemen spesifik yang kamu butuhkan, yang dibahas di modul 6.
Mengapa ini penting untuk kode yang bersih
Kegagalan senyap adalah jenis yang paling buruk: scraper yang mengumpulkan 500 halaman "Product not found" melaporkan sukses dan merusak dataset-mu. Mengecek status dan gagal dengan berisik (atau mencatat di log lalu melewatinya) menjaga data buruk tetap di luar. Screenshot saat gagal membuat masalah yang tidak bisa kamu cegah cepat didiagnosis.
Rangkuman
response = page.goto(url); cekresponse.ok/response.status.- Bernavigasi dengan mengklik link atau dengan
goto; URL relatif di-resolve terhadap halaman saat ini. page.url,go_back(),go_forward(),reload().page.screenshot(path=..., full_page=True)danlocator.screenshot(path=...).gotomenungguload; tunggu elemen spesifik saat konten datang lewat JavaScript.