DataLens

Bernavigasi antarhalaman dan mengambil screenshot

Pergi ke URL dan cek status response-nya, ikuti link, maju dan mundur, serta simpan screenshot halaman dan elemen untuk melihat apa yang dilihat scraper-mu.

Level: Dasar · 7 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

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.

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

(get_by_role menemukan elemen dengan cara manusia mendeskripsikannya, "link bernama Laptops". Modul 4 membahasnya dengan tuntas.)

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']

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.

Ide utama

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

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Memilih elemen (selector, get_by_role / get_by_text) →