
Anh Tuan
Data Science Expert
Đã xuất bản Sep 29, 2026
Đã cập nhật Sep 29, 2026 · đọc tối thiểu

Các mô hình ngôn ngữ lớn có thể biến nội dung web không nhất quán thành các bản ghi hữu ích, nhưng chúng không loại bỏ công việc vận hành cần thiết để có được dữ liệu trang đáng tin cậy. Một luồng sản xuất vẫn cần kiểm tra quyền, giới hạn yêu cầu, thực thi trình duyệt khi JavaScript được yêu cầu, xử lý rõ ràng các điểm kiểm tra xác minh và xác minh xác định trước khi bản ghi đến cơ sở dữ liệu.
GLM-5.3 hữu ích ở lớp giải thích. Quy trình API tương thích của nó có thể phân loại nội dung đã hiển thị, ánh xạ văn bản vào một sơ đồ, giải thích tại sao một trường bị thiếu và giúp chuẩn hóa sự khác biệt giữa các trang. Đối với tự động hóa được ủy quyền gặp nhiệm vụ xác minh được hỗ trợ, CapSolver có thể được đặt trước trích xuất trong khi ứng dụng duy trì kiểm soát phiên trang và xác minh kết quả cuối cùng.
Hướng dẫn này trình bày kiến trúc chung thay vì hướng dẫn cụ thể cho một trang web nào đó. Sử dụng nó chỉ cho dữ liệu công khai hoặc được ủy quyền khác và dừng lại khi quy trình đạt đến các giới hạn đăng nhập, thanh toán, dữ liệu cá nhân hoặc quyền hạn ngoài phạm vi được phê duyệt.
Một hệ thống thu thập dữ liệu web GLM-5.3 mạnh mẽ sử dụng chuỗi các giai đoạn nhỏ. Mỗi giai đoạn tạo ra kết quả có kiểu mà giai đoạn tiếp theo có thể xác minh.
| Giai đoạn | Trách nhiệm | Đầu ra mong đợi | Điều kiện dừng |
|---|---|---|---|
| Cổng quyền hạn | Kiểm tra mục tiêu, phạm vi dữ liệu, tốc độ và mục đích | Định nghĩa công việc được phê duyệt | Phạm vi không được ủy quyền |
| Lớp truy cập | Lấy hoặc hiển thị trang | Trạng thái, tiêu đề, URL cuối cùng, HTML hoặc hình chụp màn hình | Đăng nhập, thanh toán, dữ liệu riêng tư hoặc truy cập bị từ chối |
| Bộ phân loại phản hồi | Xác định nội dung, trang trống, giới hạn tốc độ hoặc trang xác minh | Trạng thái trang được đặt tên | Trạng thái không xác định hoặc không được hỗ trợ |
| Bộ thích ứng xác minh | Gửi một nhiệm vụ được tài liệu hóa khi được phép | Chuẩn bị, đang xử lý hoặc lỗi cuối cùng | Hạn chót hoặc ngân sách thử lại đạt |
| Trích xuất GLM | Chuyển đổi nội dung được phép thành sơ đồ nghiêm ngặt | Bản ghi JSON ứng viên | Đầu ra không hợp lệ hoặc không được hỗ trợ bởi bằng chứng |
| Xác minh xác định | Kiểm tra kiểu, trường bắt buộc, trùng lặp và bằng chứng nguồn | Bản ghi được chấp nhận hoặc từ chối rõ ràng | Bất kỳ quy tắc kinh doanh nào thất bại |
| Lưu trữ | Thực hiện ghi có tính chất không thay đổi | ID bản ghi ổn định và liên kết theo dõi | Khóa nguồn đã tồn tại mà không có phiên bản mới |
Ranh giới quan trọng nhất là giữa truy cập và giải thích. Nếu mô hình nhận HTML của trang thử thách, nó có thể tự tin mô tả trang đó là nội dung mục tiêu. Phân loại phản hồi trước khi kích hoạt mô hình.
Ví dụ điều phối sử dụng Python 3.11 hoặc mới hơn và gói requests. Giữ thông tin xác thực trong biến môi trường và không bao giờ bao gồm chúng trong mã nguồn, lời nhắc, nhật ký, hình chụp màn hình hoặc cấu hình được ghi lại.
python -m venv .venv
source .venv/bin/activate
pip install requests
export ZAI_API_KEY="thay-thế-bằng-mã-z-ai-của-bạn"
export CAPSOLVER_API_KEY="thay-thế-bằng-mã-capsolver-của-bạn"
Tài liệu API Z.ai chính thức sử dụng điểm cuối chat-completions tại https://api.z.ai/api/paas/v4/chat/completions. Xác nhận tên mô hình hiện tại trong kho lưu trữ GLM-5 hoặc bảng điều khiển Z.ai trước khi triển khai; hướng dẫn này sử dụng glm-5.3-flash như một mặc định cấu hình môi trường.
Đừng yêu cầu mô hình "trích xuất mọi thứ quan trọng". Xác định các trường, hành vi null được phép và yêu cầu bằng chứng trước khi thu thập trang.
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
Mô hình được phép trả về null chỉ khi sơ đồ cho phép rõ ràng. Các giá trị bắt buộc phải được xác minh dựa trên bằng chứng trang bằng mã thông thường.
Lớp truy cập nên trả về một đối tượng trạng thái nhỏ thay vì chỉ chuỗi HTML. Bộ phân loại có thể sử dụng mã trạng thái, URL cuối cùng, loại nội dung, các lựa chọn mong đợi và các dấu hiệu điểm kiểm tra đã biết.
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 và HTTP 429 không nên vào vòng lặp thử lại chung. Một yêu cầu bị từ chối cần xem xét lại quyền và cấu hình. Một yêu cầu bị giới hạn tốc độ cần giảm bớt đồng thời toàn cục và tuân thủ khoảng thời gian thử lại do máy chủ cung cấp.
API chính thức của CapSolver sử dụng createTask để gửi một nhiệm vụ được tài liệu hóa. Các nhiệm vụ bất đồng bộ được kiểm tra bằng getTaskResult. Ứng dụng phải chọn loại nhiệm vụ từ tài liệu nhiệm vụ hiện tại và chỉ truyền các trường cần thiết cho điểm kiểm tra được phép.
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")
Người gọi nên cho phép chỉ một lần thử có giới hạn theo mặc định. Giải pháp trả về phải được áp dụng thông qua đường tích hợp được tài liệu hóa trong cùng ngữ cảnh trình duyệt đã phát hiện điểm kiểm tra. Nếu trang không chuyển sang trạng thái mong đợi, trả về thất bại hoặc yêu cầu xem xét của con người.
Nhận mã thưởng CapSolver của bạn
Tăng ngân sách tự động hóa của bạn ngay lập tức!
Sử dụng mã thưởng CAP26 khi nạp tiền vào tài khoản CapSolver để nhận thêm 5% thưởng cho mỗi lần nạp tiền — không giới hạn.
Nhận mã thưởng ngay trong Bảng điều khiển CapSolver
Sau khi xác nhận trang là nội dung, loại bỏ tiếng ồn điều hướng, mã JavaScript, phần tử ẩn, banner lặp lại và các yếu tố không liên quan khác. Giữ nguyên tiêu đề, nhãn, bảng và tham chiếu nguồn. Không gửi cookie trình duyệt, tiêu đề xác thực, dữ liệu cá nhân hoặc dấu vết phiên thô đến mô hình.
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": [
"Trả về một đối tượng JSON và không có văn bản.",
"Sử dụng chỉ bằng chứng có sẵn trong page_text.",
"Không suy luận giá trị bắt buộc bị thiếu.",
"Bao gồm source_url chính xác như cung cấp.",
],
"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": "Trích xuất dữ liệu có bằng chứng."},
{"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)
Xem ví dụ như một ranh giới bộ chuyển đổi. Xác nhận các tùy chọn yêu cầu hiện tại và tính năng đầu ra có cấu trúc trong tài liệu Z.ai chính thức trước khi sử dụng trong sản xuất. Nếu mô hình bao bọc JSON trong Markdown hoặc trả về văn bản ngoài hợp đồng, từ chối phản hồi thay vì cố gắng sửa chữa nó một cách im lặng.
Hai loại xác minh khác nhau được yêu cầu.
Đầu tiên, xác minh kết quả trình duyệt. Xác nhận rằng URL cuối cùng, tiêu đề mong đợi, khối mục tiêu và sự vắng mặt của lỗi mới phù hợp với quy trình mong muốn. Một phản hồi nhiệm vụ thành công không phải là bằng chứng rằng trang tiếp tục.
Thứ hai, xác minh bản ghi trích xuất. Kiểm tra các chuỗi bắt buộc, phạm vi số, ngày tháng, URL đã chuẩn hóa, khóa trùng lặp và đoạn bằng chứng. Đối với các trường có tác động lớn, so sánh giá trị với một lựa chọn xác định hoặc một đại diện độc lập thứ hai của trang.
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)
Cổng cuối cùng ngăn chặn trang thử thách, ảo tưởng của mô hình hoặc hiển thị không đầy đủ vào cơ sở dữ liệu như một lần thu thập thành công.
Ghi lại ID theo dõi, URL nguồn, URL cuối cùng, trạng thái trang, băm nội dung, tên mô hình, phiên bản lời nhắc, phiên bản sơ đồ, kết quả xác minh và thời gian xử lý. Lưu trữ ID nhiệm vụ và mã lỗi cho việc gỡ lỗi ngắn hạn, nhưng không lưu trữ token giải pháp, bí mật hoặc dữ liệu phiên không liên quan.
Áp dụng một ngân sách cho toàn bộ công việc. Đếm số lần thử HTTP, điều hướng trình duyệt, thử lại xác minh, gọi GLM, số ký tự đầu vào và thời gian trôi qua. Khi ngân sách hết, trả về lỗi có kiểu thay vì cho phép một thành phần khởi động lại quy trình.
Tập hợp chỉ số hữu ích bao gồm:
| Triệu chứng | Nguyên nhân có thể | Hành động đúng |
|---|---|---|
| GLM trả về chi tiết về trang xác minh | Phản hồi không được phân loại trước khi kích hoạt | Dừng cuộc gọi mô hình và sửa phát hiện trạng thái trang |
| JSON phân tích nhưng các trường bắt buộc trống | Lời nhắc hoặc bằng chứng nguồn không đầy đủ | Từ chối bản ghi và kiểm tra nội dung đã chuẩn hóa |
| Nhiệm vụ sẵn sàng nhưng trang vẫn bị chặn | Môi trường trình duyệt hoặc tham số nhiệm vụ không khớp | So sánh URL, phiên, user agent, thời gian và yêu cầu được tài liệu hóa |
| Chi phí tăng trong khi bản ghi được chấp nhận không thay đổi | Tăng cấp trình duyệt hoặc mô hình quá rộng | Thêm bộ lọc xác định và ngân sách theo công việc |
| Các hàng trùng lặp xuất hiện sau thử lại | Lưu trữ không có tính chất không thay đổi | Cập nhật bằng khóa nguồn ổn định và phiên bản nội dung |
| HTTP 429 lặp lại | Đồng thời được kiểm soát theo từng công nhân, không toàn cục | Giới thiệu ngân sách tốc độ chung và tuân thủ hướng dẫn thử lại |
GLM-5.3 có thể làm cho việc trích xuất dữ liệu web linh hoạt hơn, nhưng độ tin cậy đến từ hệ thống xung quanh. Giữ quyền truy cập, hiển thị, phân loại trạng thái trang, xử lý xác minh, xác minh sơ đồ và lưu trữ như các giai đoạn rõ ràng. Sử dụng mô hình chỉ sau khi ứng dụng xác nhận rằng nó đang xem nội dung mong muốn.
Đối với quy trình trình duyệt được ủy quyền với nhiệm vụ xác minh được hỗ trợ, CapSolver có thể cung cấp ranh giới nhiệm vụ được tài liệu hóa. Ứng dụng vẫn chịu trách nhiệm về quyền, liên tục phiên, thử lại có giới hạn, xử lý bí mật và bằng chứng rằng quy trình ban đầu đã hoàn thành.
Câu hỏi: GLM-5.3 có thể thay thế trình duyệt trong việc thu thập dữ liệu web không?
Không. Nó có thể hiểu văn bản, hình ảnh chụp màn hình hoặc các bản ghi đã chuẩn hóa, nhưng trình duyệt hoặc client HTTP vẫn chịu trách nhiệm điều hướng, hiển thị, trạng thái, quyền truy cập và kiểm tra kết quả cuối cùng.
Câu hỏi: Nên gửi HTML thô trực tiếp đến GLM-5.3 không?
Thường không. Đầu tiên phân loại phản hồi, xóa các tập lệnh và tiếng ồn bố cục lặp lại, giữ lại các nhãn và cấu trúc có ý nghĩa, và giới hạn đầu vào chỉ với dữ liệu cần thiết theo lược đồ trích xuất.
Câu hỏi: Khi nào luồng công việc nên gọi CapSolver?
Chỉ sau khi phát hiện nhiệm vụ được hỗ trợ trong luồng được phép. Sử dụng loại nhiệm vụ được tài liệu hóa hiện tại, duy trì ngữ cảnh trình duyệt cần thiết, đặt thời hạn, và xác minh rằng trang thực sự tiếp tục.
Câu hỏi: JSON hợp lệ có nghĩa là bản ghi trích xuất chính xác không?
Không. Cú pháp JSON không chứng minh tính chính xác về mặt sự thật. Các trường bắt buộc, kiểu dữ liệu, URL, ngày tháng, phạm vi số, bản ghi trùng lặp và bằng chứng nguồn vẫn cần được kiểm tra trong mã.
Câu hỏi: Điều gì nên xảy ra khi trạng thái trang không xác định?
Dừng lại và yêu cầu kiểm tra. Không gửi nội dung không xác định đến mô hình hoặc thử lại thông qua các bước trình duyệt và kiểm tra bổ sung.
Câu hỏi: Thiết kế này có thể sử dụng cho dữ liệu riêng tư hoặc bị hạn chế không?
Thiết kế không tạo ra quyền truy cập. Sử dụng nó chỉ cho dữ liệu công khai hoặc đã được cấp phép, tối thiểu hóa thông tin thu thập, và tuân thủ các điều khoản, hợp đồng và luật pháp áp dụng.

Anh Tuan
Data Science Expert
Turning task outcomes into actionable insights.
GIỚI THIỆU TÁC GIẢ
Hiểu về hỗ trợ proxy MCP CAPTCHA trên kết nối phía khách hàng, trình duyệt và nhiệm vụ giải quyết, bao gồm các hạn chế của công cụ MCP CapSolver hiện tại.

Hiểu cách xử lý CAPTCHA của Stagehand, so sánh các hành động trình duyệt với dịch vụ giải CAPTCHA, và chọn một phương pháp rõ ràng cho trình duyệt cục bộ hoặc phiên làm việc được lưu trữ.
