
Anh Tuan
Data Science Expert

Một trí tuệ nhân tạo (AI) có thể nhận được bản ghi có vẻ hợp lệ từ trang sai. Một màn hình đăng nhập có thể chứa tiêu đề, tài liệu không đầy đủ có thể phân tích thành công, và mô hình có thể trả về JSON ngay cả khi các sự kiện được yêu cầu bị thiếu. Kiến trúc truy cập và trích xuất web cho AI cần các quyết định riêng biệt để tiếp cận nguồn và diễn giải nội dung của nó.
Hướng dẫn này thiết kế ranh giới xung quanh một bản chụp bất biến và hợp đồng bản ghi được phiên bản hóa. Quy trình này áp dụng cho việc thu thập có quyền hạn của thông báo công cộng, cập nhật tài liệu và các thông tin web được phép khác. CapSolver xuất hiện như một khả năng xử lý CAPTCHA được hỗ trợ ở lớp truy cập. Ví dụ chạy sau đó cho thấy cách phân loại kết quả thu thập, trích xuất một tập hợp bản ghi nhỏ và lưu giữ bằng chứng khi xác minh thất bại.
Lớp truy cập nên trả về hoặc là bản chụp có thể sử dụng hoặc là lỗi rõ ràng; lớp trích xuất nên trả về các bản ghi tiềm năng liên kết với bản chụp đó. Giữ cả hai hợp đồng ổn định ngay cả khi runtime trình duyệt, trình phân tích cú pháp hoặc mô hình thay đổi.
Quy trình là: yêu cầu thu thập được phê duyệt → bộ thích ứng truy cập → bản chụp được lưu giữ → bộ thích ứng trích xuất → xác minh → kho lưu trữ bản ghi được chấp nhận → AI. Trong thiết kế này, trích xuất có thể chạy lại từ bằng chứng lưu trữ mà không cần mở lại trình duyệt.
Giao cho bộ thích ứng truy cập một nguồn được phê duyệt, một danh tính tác vụ, một ngân sách thời gian và một ngữ cảnh phiên được phép. Nhiệm vụ của nó bao gồm việc chọn biểu diễn cần thiết, chờ đợi nội dung liên quan, bảo tồn quyền sở hữu phiên và phân loại lỗi. Cấu hình mạng và render JavaScript thuộc về cơ sở hạ tầng HTTP hoặc trình duyệt của bạn.
Đầu ra nên ghi lại vị trí nguồn được yêu cầu và cuối cùng, thời gian quan sát, loại biểu diễn, băm nội dung và bằng chứng sẵn sàng. Tránh một cờ "thành công" duy nhất che giấu trang thực sự đã tải. Một URL cuối cùng và trạng thái HTTP giúp, nhưng việc kiểm tra danh tính tài liệu mong đợi và các khu vực nội dung cần thiết cũng cần thiết.
Giao cho trình trích xuất một tham chiếu bản chụp, phiên bản lược đồ và định nghĩa trường. Nó không nên tự động điều hướng, thay đổi thông tin đăng nhập hoặc chọn đường mạng khác. Trả về các trường bị thiếu hoặc mơ hồ thay vì yêu cầu lớp truy cập tiếp tục thử cho đến khi giá trị xuất hiện.
Khái niệm truy cập web AI mô tả cách sử dụng rộng hơn của AI trong việc thu thập và diễn giải thông tin web. Ranh giới này cũng hỗ trợ trích xuất xác định: các thuộc tính ổn định hoặc dữ liệu có cấu trúc được tài liệu hóa có thể đủ. Sử dụng mô hình khi cần diễn giải, đồng thời duy trì cùng hợp đồng xác minh phía sau.
Một bản chụp có thể sử dụng phải chứa bằng chứng cần thiết cho các trường được yêu cầu, trong một biểu diễn mà trình trích xuất hiểu được. Chọn HTML, DOM đã được render hoặc ảnh chụp màn hình theo yêu cầu đó.
HTML thô phù hợp khi phản hồi đã chứa nội dung liên quan. Nếu các trường cần thiết chỉ xuất hiện sau khi thực thi phía khách, bộ thích ứng trình duyệt nên chụp DOM đã được render sau một kiểm tra sẵn sàng cụ thể cho tác vụ. Định nghĩa sẵn sàng là một điều kiện quan sát được, chẳng hạn như hộp chứa bản ghi mong đợi và dấu hiệu hoàn thành, thay vì ngủ cố định toàn cục.
Ghi lại loại biểu diễn đã chụp. Một trình phân tích cú pháp được kiểm tra trên mã đã được render không nên nhận được vỏ HTML ban đầu mà không có thay đổi hợp đồng rõ ràng. Nếu một khu vực cần thiết vắng mặt, phân loại bản chụp là không đầy đủ trước khi cố gắng trích xuất.
Ảnh chụp màn hình cung cấp pixel từ một góc nhìn nhất định tại một thời điểm nhất định. Đối với trích xuất dựa trên ảnh chụp màn hình, giữ kích thước ảnh, bối cảnh chụp và tham chiếu khu vực cho mỗi trường được trích xuất. Nếu giá trị nằm ngoài khung nhìn được chụp, trả về nó là bị thiếu; sự quen thuộc của mô hình với bố cục tương tự không phải là bằng chứng cho giá trị đó.
Không chuyển đổi ước tính trực quan thành số chính xác mà không ghi lại độ không chắc chắn. Khi cả DOM và bằng chứng trực quan đều có sẵn, sử dụng sự bất đồng như trường hợp cần xem xét lại. Mẫu dưới đây chỉ triển khai bộ thích ứng HTML; bộ thích ứng thị giác cần có các kiểm tra bằng chứng và tập đánh giá riêng.
Quyết định thử lại nên nêu rõ lớp bị lỗi, lợi ích mong đợi của lần thử tiếp theo và ngân sách còn lại. Giữ thử lại cho thu thập và diễn giải riêng biệt để lỗi trích xuất không tạo ra lưu lượng không kiểm soát.
| Quan sát | Lớp chịu trách nhiệm | Hành động đề xuất |
|---|---|---|
| Thời gian đọc hết hoặc lỗi dịch vụ tạm thời được chọn | Truy cập | Chỉ thử lại đọc được phép trong ngân sách thời gian và lần thử |
| HTTP 429 hoặc thời gian chờ được yêu cầu bởi dịch vụ | Truy cập | Hoãn cho bộ lập lịch chung và giữ tín hiệu thời gian chờ |
| HTTP 401/403 hoặc xác thực không rõ ràng | Truy cập | Dừng lại và xem xét đường truy cập được phép |
| Thách thức CAPTCHA được nhận diện | Truy cập | Dừng lại để kiểm tra tính hợp lệ và đánh giá tác vụ được hỗ trợ |
| Trả về rỗng, tài liệu sai hoặc khu vực cần thiết bị thiếu | Truy cập | Lưu giữ bằng chứng chẩn đoán và kiểm tra sẵn sàng |
| Trường bị thiếu, ngày không hợp lệ, bản ghi trùng lặp hoặc không khớp lược đồ | Trích xuất/xác minh | Cách ly bản ghi tiềm năng và chạy lại trên bản chụp |
| Hình dạng hợp lệ nhưng ý nghĩa không được hỗ trợ | Xác minh | Từ chối hoặc yêu cầu xem xét; không coi văn bản trơn tru là bằng chứng |
Ý nghĩa HTTP quan trọng khi triển khai hàng đầu. Quy tắc thử lại và tính idempotent của RFC 9110 phân biệt các thao tác có thể được lặp lại an toàn với các thao tác có hiệu ứng có thể không chắc chắn. Không sử dụng vòng lặp thử lại đọc cho các hành động thay đổi trạng thái như gửi biểu mẫu.
Tiêu đề Retry-After có thể biểu diễn độ trễ hoặc ngày HTTP. Giữ giá trị đó để lập lịch. Một công nhân cục bộ không nên thay thế thời gian chờ được yêu cầu bởi máy chủ bằng backoff ngắn hơn, và các công nhân chia sẻ cùng phạm vi thu thập được phép nên chia sẻ trạng thái thời gian chờ.
CapSolver nên xử lý chỉ một nhiệm vụ CAPTCHA được tài liệu hóa sau khi quy trình của bạn đã thiết lập quyền truy cập, tính tương thích tác vụ và ngữ cảnh phiên cần thiết. Một phản hồi 403, trang trống và hộp CAPTCHA là các quan sát khác nhau; tránh ánh xạ tất cả chúng thành yêu cầu giải quyết.
Hợp đồng createTask của CapSolver yêu cầu đối tượng nhiệm vụ phù hợp. Đối với công việc bất đồng bộ, getTaskResult trả về trạng thái và đầu ra của nhiệm vụ. Bộ thích ứng truy cập vẫn chịu trách nhiệm áp dụng tích hợp được tài liệu hóa và kiểm tra đích sau đó.
Một nhiệm vụ hoàn thành không phải là bản chụp trang đã được xác minh. Kiểm tra lại danh tính tài liệu và điều kiện sẵn sàng trước khi chuyển nội dung cho trích xuất. Thiết lập ngân sách riêng cho thách thức và dừng lại khi thách thức không được hỗ trợ, xác thực không rõ ràng hoặc trang mong đợi vẫn không khả dụng. Ngăn xếp cơ sở hạ tầng trình duyệt cho AI cung cấp hướng dẫn liên quan về quyền sở hữu runtime và bằng chứng phiên.
Nhận Mã Ưu đãi 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ã ưu đãi CAP26 khi nạp tiền vào tài khoản CapSolver để nhận thêm 5% ưu đãi cho mỗi lần nạp tiền — không giới hạn.
Nhận mã ngay bây giờ trong Bảng điều khiển CapSolver
Quy trình Python sau phân loại các phản hồi truy cập tổng hợp, lưu trữ HTML được chấp nhận, trích xuất các trường thông báo và trả về JSON có cấu trúc. Lưu thành pipeline_example.py và chạy với Python 3.9 hoặc cao hơn; nó chỉ sử dụng thư viện chuẩn.
Hàm fetch là một bộ thích ứng chỉ đọc được chèn. Ở đây nó cung cấp các bộ dữ liệu trong bộ nhớ, và minh họa vô hiệu hóa thời gian chờ. Không liên hệ với trang web, dịch vụ trình duyệt, mô hình hoặc API CAPTCHA. Các trường challenge và ready đại diện cho các quan sát được cung cấp bởi bộ thích ứng truy cập; ví dụ không triển khai bộ phát hiện thách thức toàn cục.
Trình phân tích sử dụng các callback của Python's HTMLParser cho một hợp đồng mã hóa nhỏ: mỗi article chứa một h2, một ID bản ghi và ngày xuất bản. Nó không phải là trình phân tích cú pháp DOM tổng quát hoặc trình xác minh cho HTML bị hỏng bất kỳ.
from dataclasses import dataclass
from datetime import date
from hashlib import sha256
from html.parser import HTMLParser
import json
import time
class PipelineError(Exception):
def __init__(self, stage, reason, retry_after=""):
self.stage, self.reason = stage, reason
self.retry_after = retry_after
super().__init__(f"{stage}:{reason}")
@dataclass(frozen=True)
class Reply:
status: int
body: str = ""
content_type: str = "text/html"
challenge: bool = False
ready: bool = True
retry_after: str = ""
def access(fetch, wait=time.sleep):
# fetch is a read-only adapter; all values below are application policy.
for attempt in range(2):
try:
reply = fetch()
except TimeoutError:
if attempt == 0:
wait(0.5)
continue
raise PipelineError("access", "timeout_exhausted")
if reply.status == 429:
# Pass Retry-After to a shared scheduler; do not retry here.
raise PipelineError("access", "defer_rate_limit", reply.retry_after)
if reply.status in (401, 403):
raise PipelineError("access", "authorization_review")
if reply.challenge:
raise PipelineError("access", "challenge_review")
if reply.status == 503 and reply.retry_after:
raise PipelineError("access", "defer_service", reply.retry_after)
if reply.status in (502, 503, 504) and attempt == 0:
wait(0.5)
continue
if reply.status != 200:
raise PipelineError("access", "http_status")
if reply.content_type.split(";")[0].strip().lower() != "text/html":
raise PipelineError("access", "representation_mismatch")
if not reply.ready or not reply.body.strip():
raise PipelineError("access", "incomplete_snapshot")
return reply.body
raise PipelineError("access", "attempts_exhausted")
class BulletinParser(HTMLParser):
# This small parser supports only the documented fixture markup.
def __init__(self):
super().__init__(convert_charrefs=True)
self.rows, self.current, self.in_title = [], None, False
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if tag == "article":
if self.current is not None:
raise PipelineError("extraction", "nested_record")
self.current = {"id": attrs.get("data-id", ""),
"published": attrs.get("data-published", ""),
"title_parts": [], "title_count": 0}
elif tag == "h2" and self.current is not None:
self.current["title_count"] += 1
self.in_title = True
def handle_data(self, data):
if self.current is not None and self.in_title:
self.current["title_parts"].append(data)
def handle_endtag(self, tag):
if tag == "h2":
self.in_title = False
if tag == "article" and self.current is not None:
self.rows.append(self.current)
self.current, self.in_title = None, False
def extract(html):
parser = BulletinParser()
parser.feed(html)
parser.close()
if parser.current is not None or not parser.rows:
raise PipelineError("extraction", "record_structure")
records, seen = [], set()
for row in parser.rows:
title = " ".join("".join(row["title_parts"]).split())
if not row["id"].strip() or not title or row["title_count"] != 1:
raise PipelineError("extraction", "required_field")
try:
published = date.fromisoformat(row["published"]).isoformat()
except ValueError:
raise PipelineError("extraction", "invalid_date")
if row["id"] in seen:
raise PipelineError("extraction", "duplicate_id")
seen.add(row["id"])
records.append({"id": row["id"], "title": title,
"published": published})
return records
def run(fetch, archive, wait=time.sleep):
html = access(fetch, wait)
digest = sha256(html.encode("utf-8")).hexdigest()
archive[digest] = html # In-memory evidence retained even if parsing fails.
records = extract(html)
return {"schema_version": "bulletins.v1", "source_id": "fixture:bulletins",
"snapshot_sha256": digest,
"records": records}
if __name__ == "__main__":
html = ('<article data-id="notice-1" data-published="2026-09-10">'
'<h2>Maintenance window announced</h2></article>')
replies = iter([Reply(503), Reply(200, html)])
archive = {}
output = run(lambda: next(replies), archive, wait=lambda seconds: None)
print(json.dumps(output, indent=2))
Ví dụ nhận được một phản hồi 503 tổng hợp sau đó là một phản hồi HTML hợp lệ. Nó tạo ra kết quả sau:
{
"schema_version": "bulletins.v1",
"source_id": "fixture:bulletins",
"snapshot_sha256": "6ed8df5a98ee53e2889feb5ef7ed4dd8d549dba82882580418d4ca9656b7d46b",
"records": [
{
"id": "notice-1",
"title": "Maintenance window announced",
"published": "2026-09-10"
}
]
}
Mỗi bản ghi phải có ID, một tiêu đề không rỗng và ngày tháng có thể phân tích. Các ID trùng lặp sẽ từ chối batch. Digest của bản chụp màn hình kết nối đầu ra với HTML được lưu giữ, và lỗi trích xuất sẽ để lại HTML này trong kho lưu trữ do người gọi sở hữu để tái phát.
Giới hạn thử lại là hai lần và độ trễ nửa giây là chính sách ứng dụng ví dụ, không phải khuyến nghị của nhà cung cấp. Vòng lặp sẽ hoãn ngay lập tức khi gặp 429, duy trì thời gian chờ 503 và dừng khi gặp xác thực hoặc xem xét lại. Một lỗi trong extract không thể gọi fetch lại.
Thực hiện tiếp nhận nguồn, kiểm tra chuyển hướng, giải mã nội dung được hỗ trợ, thời gian chờ cho mỗi yêu cầu và thời hạn tổng trước khi kết nối ví dụ với giao diện thực tế. Một hàm fetch đồng bộ không bao giờ trả về kết quả không được giới hạn bởi bộ đếm thử lại. Truyền thời hạn còn lại vào giao diện và bao gồm thời gian chờ thử lại trong ngân sách đó.
Thay thế kho lưu trữ trong bộ nhớ bằng kho lưu trữ có kiểm soát, và thêm thời gian quan sát, danh tính nguồn thực tế, phiên bản trình trích xuất và phiên bản lược đồ vào metadata của nó. Áp dụng giới hạn kích thước trước khi giải mã hoặc phân tích. Một bản chụp màn hình thất bại hoặc chưa hoàn tất vẫn có thể là bằng chứng chẩn đoán hữu ích, nhưng hãy giữ nó tách biệt khỏi danh sách các bản chụp màn hình đủ điều kiện để trích xuất.
Dữ liệu được chấp nhận cần kiểm tra về ý nghĩa và phạm vi ngoài cấu trúc JSON. Ví dụ kiểm tra hợp đồng nhỏ và xác định; một dịch vụ trích xuất tổng quát cần chính sách chấp nhận phong phú hơn.
Bắt đầu bằng định nghĩa trường. Ngày xuất bản, ngày cập nhật và thời điểm thu thập mô tả các sự kiện khác nhau. Xác định trường nào người điều hành cần và từ chối các thay thế. Đối với các trường được tạo bởi mô hình, gắn kết một vùng nguồn hoặc khu vực trực quan và kiểm tra xem bằng chứng có hỗ trợ ý nghĩa của trường hay không. Một từ khớp ở đâu đó trên trang là quá yếu cho các trường như giá, khả năng có sẵn hoặc ngày tháng.
Kiểm tra tính đầy đủ ở cấp độ thu thập. Một mảng trống có thể có nghĩa là "không có bản ghi", thay đổi bố cục, phân trang không hoàn chỉnh hoặc lỗi trích xuất. Chấp nhận kết quả trống chỉ khi nguồn cung cấp trạng thái trống rõ ràng và được xác minh. Bộ thử nghiệm từ chối danh sách trống vì nó không có hợp đồng như vậy.
Định nghĩa khoảng thời gian tươi mới cho nhiệm vụ. Trích xuất lại bản chụp màn hình cũ có thể sửa lỗi bộ phân tích, nhưng không làm cho quan sát nền tảng trở nên mới. Bao gồm danh tính bản chụp màn hình và phiên bản trình trích xuất/lược đồ trong khóa tái phát, sau đó công bố các bản ghi được chấp nhận thông qua thao tác lưu trữ idempotent. Giữ các ứng viên bị từ chối sẵn có để xem xét chẩn đoán trong thời gian giới hạn thay vì trộn chúng vào tập dữ liệu làm việc của người điều hành.
Xem nội dung trang web như đầu vào không đáng tin cậy suốt quá trình. Hướng dẫn ngăn chặn xâm nhập đầu vào của OWASP mô tả các rủi ro từ các chỉ thị được nhúng trong nội dung bên ngoài. Giữ công cụ trích xuất tách biệt khỏi thông tin xác thực và các hành động quan trọng; văn bản nguồn không nên có quyền lực để thay đổi phạm vi thu thập hoặc gửi dữ liệu đến nơi khác.
Các kiểm thử biên giới nên xác minh cả kết quả trả về và sự vắng mặt của công việc không mong muốn. Một kiểm thử bộ phân tích thành công không chứng minh rằng lớp truy cập dừng đúng cách.
Đối với ví dụ này, kiểm tra thời gian chờ sau đó thành công, lỗi tạm thời lặp lại, phản hồi 200 được đánh dấu là thách thức, 429 với thời gian chờ, đại diện không được hỗ trợ, tiêu đề thiếu, ngày tháng không hợp lệ và ID trùng lặp. Đếm số lần gọi bộ thích ứng: trường hợp thách thức nên dừng sau một lần gọi, và lỗi phân tích nên giữ lại bản chụp màn hình mà không có lần truy cập nào khác.
Bộ kiểm thử cục bộ đi kèm đã vượt qua 21 kiểm tra cho luồng bộ thử nghiệm, bao gồm việc hết số lần thử lại, duy trì thời gian chờ, giữ lại bản chụp màn hình và tái phát xác định. Đây là các kiểm tra phần mềm tổng hợp, không phải tỷ lệ thành công nguồn sống hoặc tiêu chuẩn trích xuất mô hình.
Trước khi triển khai, thêm một nguồn thử nghiệm nhỏ được phép và kiểm tra khả năng sẵn sàng hiển thị thực tế, xử lý chuyển hướng, hết hạn phiên, hủy bỏ giao thông vận tải và bằng chứng đầu ra. Đo lường các bản chụp màn hình đủ điều kiện và bản ghi được chấp nhận riêng biệt. Sự phân chia này cho bạn biết liệu có nên cải thiện thu thập hay diễn giải khi tỷ lệ chấp nhận cuối cùng thay đổi.
Một kiến trúc người điều hành AI thu thập web trở nên dễ vận hành hơn khi mỗi giai đoạn có đầu ra quan sát được và người sở hữu rõ ràng. Giữ hợp đồng truy cập tập trung vào các bản chụp màn hình đủ điều kiện, hợp đồng trích xuất tập trung vào các trường ứng viên và kiểm tra tập trung vào bằng chứng, tính đầy đủ và thời gian tươi mới.
Bắt đầu với quy trình cục bộ, thực hành các đường đi tiêu cực và chỉ kết nối nguồn được phép sau khi giới hạn của bộ thích ứng được nêu rõ. Đối với các quy trình cần xử lý CAPTCHA được tài liệu, đánh giá CapSolver trong phạm vi truy cập này và xác minh đích trước khi tiếp tục trích xuất.
Q: Sự khác biệt giữa lớp truy cập web và lớp trích xuất dữ liệu là gì?
Lớp truy cập thu được bản chụp màn hình trang hợp lệ và phân loại các lỗi thu thập. Lớp trích xuất diễn giải bản chụp màn hình đó thành các trường ứng viên. Một kiểm tra chấp nhận riêng biệt xác định xem các bản ghi kết quả có phù hợp với người điều hành hay không.
Q: Một mô hình AI có nên nhận HTML, bản chụp DOM hoặc ảnh chụp màn hình không?
Sử dụng đại diện chứa bằng chứng cho các trường được yêu cầu. HTML có thể phù hợp với nội dung do máy chủ cung cấp, DOM được hiển thị có thể bắt giữ nội dung phía client, và ảnh chụp màn hình có thể hỗ trợ diễn giải trực quan với tham chiếu khu vực và kiểm tra độ không chắc chắn.
Q: Việc thiếu trường có nên gây ra yêu cầu trang khác không?
Việc thiếu trường nên đầu tiên kích hoạt xem xét lại hoặc trích xuất lại bản chụp màn hình được giữ lại. Yêu cầu trang mới chỉ khi bằng chứng cho thấy bản chụp màn hình không đầy đủ hoặc lỗi thời và chính sách truy cập cho phép thử lại.
Q: CapSolver phù hợp ở đâu trong kiến trúc này?
CapSolver phù hợp phía sau giao diện nhiệm vụ CAPTCHA được hỗ trợ trong lớp truy cập cho các quy trình được phép. Ứng dụng của bạn sở hữu tính đủ điều kiện nhiệm vụ, ngữ cảnh phiên, ngân sách thử lại và xác minh đích sau khi nhiệm vụ hoàn tất.
Q: Ví dụ Python có thực hiện thu thập web AI trực tiếp không?
Không. Ví dụ thực thi luồng bộ thử nghiệm HTML cục bộ và kiểm tra các hợp đồng của nó. Một triển khai trực tiếp phải thêm bộ thích ứng truy cập được phép; trích xuất dựa trên mô hình hoặc trực quan cũng cần triển khai riêng và đánh giá dựa trên bằng chứng.
Đánh giá các dịch vụ CAPTCHA doanh nghiệp thông qua thử nghiệm tập trung bao gồm tính tương thích nhiệm vụ, kết quả được chấp nhận, phân bổ chi phí, bằng chứng bảo mật và hỗ trợ.

Sử dụng danh sách kiểm tra máy chủ MCP sản xuất để xem xét quyền hạn công cụ, cô lập người thuê, đầu vào, xử lý sự cố, nhật ký và bằng chứng triển khai trước khi triển khai.
