
Aloísio Vítor
Image Processing Expert
Diterbitkan Sep 29, 2026
Diperbarui Sep 29, 2026 · min baca

Model bahasa besar dapat mengubah konten web yang tidak konsisten menjadi catatan yang berguna, tetapi tidak menghilangkan pekerjaan operasional yang diperlukan untuk mendapatkan data halaman yang dapat dipercaya. Pipeline produksi masih membutuhkan pemeriksaan izin, batas permintaan, eksekusi browser ketika JavaScript diperlukan, penanganan eksplisit untuk checkpoint verifikasi, dan validasi deterministik sebelum catatan mencapai basis data.
GLM-5.3 berguna di lapisan interpretasi. Alur kerja yang kompatibel dengan API-nya dapat mengklasifikasikan konten yang dirender, memetakan teks ke skema, menjelaskan mengapa suatu bidang hilang, dan membantu menormalkan perbedaan antara halaman. Untuk otomasi yang diizinkan yang menemui tugas verifikasi yang didukung, CapSolver dapat ditempatkan sebelum ekstraksi sementara aplikasi mempertahankan kendali sesi halaman dan memverifikasi hasil akhir.
Panduan ini menyajikan arsitektur umum bukan instruksi untuk situs web tertentu. Gunakan hanya untuk data publik atau lainnya yang diizinkan dan hentikan ketika alur kerja mencapai login, pembayaran, data pribadi, atau batas izin di luar cakupan yang disetujui.
Sistem pengambilan data web GLM-5.3 yang kuat menggunakan urutan tahapan kecil. Setiap tahapan menghasilkan hasil bertipe yang dapat diverifikasi oleh tahapan berikutnya.
| Tahapan | Tanggung Jawab | Output yang Diharapkan | Kondisi Berhenti |
|---|---|---|---|
| Pintu Persetujuan | Periksa target, cakupan data, kecepatan, dan tujuan | Definisi pekerjaan yang disetujui | Cakupan tidak diizinkan |
| Lapisan Akses | Unduh atau render halaman | Status, header, URL akhir, HTML atau screenshot | Login, pembayaran, data pribadi, atau akses ditolak |
| Klasifikator Respons | Identifikasi konten, shell kosong, batas kecepatan, atau halaman verifikasi | Nama status halaman | Status tidak dikenal atau tidak didukung |
| Adapter Verifikasi | Kirim satu tugas yang didokumentasikan ketika diizinkan | Siap, sedang diproses, atau kesalahan terminal | Batas waktu atau anggaran percobaan tercapai |
| Ekstraksi GLM | Ubah konten yang diizinkan menjadi skema yang ketat | Catatan JSON kandidat | Output tidak valid atau tidak didukung oleh bukti |
| Validasi Deterministik | Periksa tipe, bidang yang diperlukan, duplikat, dan bukti sumber | Catatan yang diterima atau penolakan eksplisit | Aturan bisnis apa pun gagal |
| Penyimpanan | Lakukan tulisan idempoten | ID catatan yang stabil dan tautan jejak | Kunci sumber sudah ada tanpa versi baru |
Batasan yang paling penting adalah antara akses dan interpretasi. Jika model menerima HTML halaman tantangan, mungkin akan dengan percaya diri menggambarkan halaman tersebut sebagai konten target. Klaskan respons sebelum memicu model.
Contoh orkestrasi menggunakan Python 3.11 atau lebih baru dan paket requests. Simpan kredensial di variabel lingkungan dan jangan pernah sertakan mereka dalam kode sumber, prompt, log, screenshot, atau konfigurasi yang dikirimkan.
python -m venv .venv
source .venv/bin/activate
pip install requests
export ZAI_API_KEY="ganti-dengan-kunci-z-ai-anda"
export CAPSOLVER_API_KEY="ganti-dengan-kunci-capsolver-anda"
Dokumentasi API Z.ai resmi menggunakan endpoint chat-completions di https://api.z.ai/api/paas/v4/chat/completions. Konfirmasikan identifikasi model saat ini di repositori GLM-5 atau konsol Z.ai sebelum deployment; panduan ini menggunakan glm-5.3-flash sebagai default yang dikonfigurasi lingkungan.
Jangan minta model untuk "ekstrak semua yang penting." Tetapkan bidang, perilaku null yang diizinkan, dan persyaratan bukti sebelum mengumpulkan halaman.
from dataclasses import dataclass
from datetime import datetime, timezone
from typing import Any
@dataclass(frozen=True)
class ExtractionJob:
source_url: str
allowed_host: str
required_fields: tuple[str, ...]
max_input_chars: int = 40_000
def validate_record(job: ExtractionJob, record: dict[str, Any]) -> dict[str, Any]:
missing = [name for name in job.required_fields if not record.get(name)]
if missing:
raise ValueError(f"missing_required_fields:{','.join(missing)}")
if record.get("source_url") != job.source_url:
raise ValueError("source_url_mismatch")
record["validated_at"] = datetime.now(timezone.utc).isoformat()
return record
Model hanya diizinkan mengembalikan null ketika skema secara eksplisit memungkinkannya. Nilai yang diperlukan harus diverifikasi terhadap bukti halaman oleh kode biasa.
Lapisan akses harus mengembalikan objek kecil berstatus daripada hanya string HTML. Klasifikator dapat menggunakan kode status, URL akhir, tipe konten, selektor yang diharapkan, dan tanda checkpoint yang diketahui.
from enum import Enum
class PageState(str, Enum):
CONTENT = "content"
JAVASCRIPT_REQUIRED = "javascript_required"
RATE_LIMITED = "rate_limited"
LOGIN_REQUIRED = "login_required"
VERIFICATION = "verification"
UNKNOWN = "unknown"
def choose_action(state: PageState) -> str:
return {
PageState.CONTENT: "extract",
PageState.JAVASCRIPT_REQUIRED: "render_in_authorized_browser",
PageState.RATE_LIMITED: "back_off",
PageState.LOGIN_REQUIRED: "stop_for_operator",
PageState.VERIFICATION: "evaluate_supported_task",
PageState.UNKNOWN: "stop_for_review",
}[state]
HTTP 403 dan HTTP 429 tidak boleh masuk ke loop ulang umum. Permintaan yang ditolak memerlukan tinjauan izin dan konfigurasi. Permintaan yang dibatasi kecepatan memerlukan pengurangan konkurensi global dan menghormati jendela ulang yang disediakan server.
API resmi CapSolver menggunakan createTask untuk mengirim tugas yang didokumentasikan. Tugas asinkron diperiksa dengan getTaskResult. Aplikasi harus memilih jenis tugas dari dokumentasi tugas saat ini dan hanya melewatkan bidang yang diperlukan untuk checkpoint yang diizinkan.
import os
import time
import requests
CAPSOLVER_BASE = "https://api.capsolver.com"
def solve_supported_task(task: dict, *, timeout_seconds: int = 45) -> dict:
api_key = os.environ["CAPSOLVER_API_KEY"]
created = requests.post(
f"{CAPSOLVER_BASE}/createTask",
json={"clientKey": api_key, "task": task},
timeout=15,
).json()
if created.get("errorId") != 0:
raise RuntimeError(created.get("errorCode", "create_task_failed"))
if created.get("status") == "ready":
return created["solution"]
task_id = created.get("taskId")
if not task_id:
raise RuntimeError("missing_task_id")
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
time.sleep(3)
result = requests.post(
f"{CAPSOLVER_BASE}/getTaskResult",
json={"clientKey": api_key, "taskId": task_id},
timeout=15,
).json()
if result.get("errorId") != 0:
raise RuntimeError(result.get("errorCode", "task_failed"))
if result.get("status") == "ready":
return result["solution"]
if result.get("status") not in {"idle", "processing"}:
raise RuntimeError("unexpected_task_status")
raise TimeoutError("verification_task_deadline_exceeded")
Panggilan harus mengizinkan satu upaya terbatas secara default. Solusi yang dikembalikan harus diterapkan melalui jalur integrasi yang didokumentasikan dalam konteks browser yang sama yang mendeteksi checkpoint. Jika halaman tidak berpindah ke status yang diharapkan, kembalikan kegagalan atau minta tinjauan manusia.
Klaim Kode Bonus CapSolver Anda
Tingkatkan anggaran otomasi Anda secara instan!
Gunakan kode bonus CAP26 saat menambahkan dana ke akun CapSolver Anda untuk mendapatkan tambahan 5% bonus pada setiap penyetoran — tanpa batas.
Klaim sekarang di Dashboard CapSolver Anda
Setelah halaman dikonfirmasi sebagai konten, hapus kebisingan navigasi, skrip, elemen tersembunyi, banner berulang, dan chrome halaman yang tidak relevan. Pertahankan judul, label, tabel, dan referensi sumber. Jangan kirim cookie browser, header otorisasi, data pribadi, atau jejak sesi mentah ke model.
import json
import os
import requests
ZAI_ENDPOINT = "https://api.z.ai/api/paas/v4/chat/completions"
def extract_with_glm(job: ExtractionJob, normalized_text: str) -> dict:
prompt = {
"source_url": job.source_url,
"required_fields": list(job.required_fields),
"rules": [
"Kembalikan satu objek JSON dan tidak ada prosa.",
"Gunakan hanya bukti yang ada di page_text.",
"Jangan infer nilai yang diperlukan hilang.",
"Sertakan source_url tepat seperti yang diberikan.",
],
"page_text": normalized_text[: job.max_input_chars],
}
response = requests.post(
ZAI_ENDPOINT,
headers={
"Authorization": f"Bearer {os.environ['ZAI_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": os.getenv("GLM_MODEL", "glm-5.3-flash"),
"messages": [
{"role": "system", "content": "Ekstrak data yang didukung bukti."},
{"role": "user", "content": json.dumps(prompt, ensure_ascii=False)},
],
"temperature": 0,
},
timeout=60,
)
response.raise_for_status()
content = response.json()["choices"][0]["message"]["content"]
return json.loads(content)
Anggap contoh sebagai batas adapter. Konfirmasikan opsi permintaan saat ini dan fitur output yang terstruktur di dokumentasi Z.ai resmi sebelum penggunaan produksi. Jika model membungkus JSON dalam Markdown atau mengembalikan teks di luar kontrak, tolak respons daripada mencoba memperbaikinya secara diam-diam.
Dua validasi berbeda diperlukan.
Pertama, validasi hasil browser. Konfirmasikan bahwa URL akhir, judul yang diharapkan, kontainer target, dan ketidakhadiran kesalahan baru sesuai dengan alur kerja yang diinginkan. Respons tugas yang sukses saja bukan bukti bahwa halaman terus berjalan.
Kedua, validasi catatan yang diekstraksi. Periksa string yang diperlukan, rentang numerik, tanggal, URL yang dinormalkan, kunci duplikat, dan potongan bukti. Untuk bidang yang berdampak tinggi, bandingkan nilai dengan selektor deterministik atau representasi kedua dari halaman.
def run_extraction(job: ExtractionJob, state: PageState, page_text: str) -> dict:
action = choose_action(state)
if action != "extract":
raise RuntimeError(f"page_not_ready_for_model:{action}")
candidate = extract_with_glm(job, page_text)
return validate_record(job, candidate)
Pintu akhir ini mencegah halaman tantangan, hallucinasi model, atau render parsial memasuki dataset sebagai pengambilan data yang sukses.
Catat ID jejak, URL sumber, URL akhir, status halaman, hash konten, nama model, versi prompt, versi skema, hasil validasi, dan waktu pemrosesan. Simpan ID tugas dan kode kesalahan untuk debugging operasional sementara, tetapi jangan simpan token solusi, rahasia, atau data sesi yang tidak relevan.
Terapkan satu anggaran untuk seluruh pekerjaan. Hitung percobaan HTTP, navigasi browser, percobaan verifikasi, panggilan GLM, karakter input, dan waktu yang berlalu. Ketika anggaran habis, kembalikan kegagalan bertipe daripada memungkinkan komponen satu untuk memulai ulang alur kerja.
Kumpulan metrik yang berguna termasuk:
| Gejala | Penyebab kemungkinan | Tindakan yang benar |
|---|---|---|
| GLM mengembalikan detail tentang halaman verifikasi | Respons tidak diklasifikasikan sebelum memicu | Hentikan panggilan model dan perbaiki deteksi status halaman |
| JSON diuraikan tetapi bidang yang diperlukan kosong | Prompt atau bukti sumber tidak lengkap | Tolak catatan dan periksa konten yang dinormalkan |
| Tugas siap tetapi halaman tetap terblokir | Konteks browser atau parameter tugas tidak sesuai | Bandingkan URL, sesi, user agent, waktu, dan persyaratan yang didokumentasikan |
| Biaya meningkat sementara catatan yang diterima tetap datar | Ekspansi browser atau model terlalu luas | Tambahkan filter deterministik dan anggaran per pekerjaan |
| Baris duplikat muncul setelah ulang | Penyimpanan tidak idempoten | Upsert berdasarkan kunci sumber yang stabil dan versi konten |
| HTTP 429 berulang | Konkurensi dikendalikan per pekerja, bukan secara global | Tambahkan anggaran kecepatan bersama dan hormati panduan ulang |
GLM-5.3 dapat membuat ekstraksi data web lebih fleksibel, tetapi keandalan berasal dari sistem di sekitarnya. Pertahankan kendali akses, rendering, klasifikasi status halaman, penanganan verifikasi, validasi skema, dan penyimpanan sebagai tahapan eksplisit. Gunakan model hanya setelah aplikasi memastikan bahwa itu melihat konten yang diinginkan.
Untuk alur kerja browser yang diizinkan dengan tugas verifikasi yang didukung, CapSolver dapat memberikan batas tugas yang didokumentasikan. Aplikasi tetap bertanggung jawab atas izin, kelanjutan sesi, ulang terbatas, penanganan rahasia, dan bukti bahwa alur kerja asli selesai.
Q: Apakah GLM-5.3 dapat menggantikan browser dalam web scraping?
Tidak. Ia dapat memahami teks, tangkapan layar, atau catatan yang dinormalkan, tetapi browser atau klien HTTP tetap mengelola navigasi, rendering, state, izin, dan verifikasi hasil akhir.
Q: Apakah HTML mentah sebaiknya dikirim langsung ke GLM-5.3?
Biasanya tidak. Klasifikasikan respons terlebih dahulu, hapus skrip dan kebisingan tata letak yang berulang, pertahankan label dan struktur yang berarti, dan batasi input hanya pada data yang diperlukan oleh skema ekstraksi.
Q: Kapan alur kerja harus memanggil CapSolver?
Hanya setelah mendeteksi tugas yang didukung dalam alur kerja yang diizinkan. Gunakan jenis tugas yang saat ini didokumentasikan, pertahankan konteks browser yang diperlukan, tetapkan tenggat waktu, dan verifikasi bahwa halaman benar-benar dilanjutkan.
Q: Apakah JSON yang valid berarti catatan yang diekstraksi benar?
Tidak. Sintaks JSON tidak membuktikan akurasi fakta. Bidang yang diperlukan, tipe, URL, tanggal, rentang numerik, duplikat, dan bukti sumber masih harus diperiksa dalam kode.
Q: Apa yang harus dilakukan jika state halaman tidak diketahui?
Berhenti dan minta tinjauan. Jangan kirim konten yang tidak diketahui ke model atau coba ulang melalui langkah browser dan verifikasi tambahan.
Q: Apakah desain ini dapat digunakan untuk data pribadi atau terbatas?
Desain ini tidak menciptakan izin. Gunakan hanya untuk data publik atau data yang diizinkan lainnya, minimalisir informasi yang dikumpulkan, dan patuhi ketentuan, kontrak, dan hukum yang berlaku.

Aloísio Vítor
Image Processing Expert
Interpreting the visual signals behind web workflows.
TENTANG PENULIS
Memahami dukungan proxy MCP CAPTCHA di sepanjang koneksi klien, peramban, dan tugas penyelesaian, termasuk batasan alat CapSolver MCP saat ini.

Pahami penanganan CAPTCHA Stagehand, bandingkan tindakan browser dengan layanan pemecah CAPTCHA, dan pilih pendekatan yang jelas untuk browser lokal atau sesi yang dihosting.
