
Anh Tuan
Data Science Expert

AntiCloudflareTask chính thức với proxy tĩnh hoặc duy trì.Việc theo dõi tồn kho thương mại điện tử đáng tin cậy là một vấn đề về bằng chứng, không chỉ là vấn đề tải trang. Một trang sản phẩm có thể hiển thị "có sẵn" trong khi một kích thước cụ thể không khả dụng, API thị trường có thể chậm hơn nguồn cấp dữ liệu nhà bán hàng, và cuộc thử thách Cloudflare có thể thay thế trang mong đợi bằng phản hồi trung gian. Quy trình đúng là ưu tiên API, nhận biết biến thể và nhất quán theo phiên. Nó sử dụng các nguồn cấp dữ liệu chính thức khi có sẵn, ghi lại các quan sát tồn kho có cấu trúc và gọi CapSolver chỉ khi cuộc thử thách Cloudflare được hỗ trợ làm gián đoạn trình duyệt được ủy quyền. Hướng dẫn này giải thích mô hình dữ liệu, luồng phục hồi cuộc thử thách, yêu cầu proxy tĩnh và user agent, chuyển giao cookie, phát hiện thay đổi tồn kho, kiểm soát cảnh báo và ranh giới tuân thủ cho các hoạt động bán lẻ, trí tuệ danh mục và theo dõi khả dụng được phê duyệt.
Việc theo dõi tồn kho nên trả lời một câu hỏi vận hành cụ thể. Các ví dụ phổ biến bao gồm:
Tránh mục tiêu mơ hồ như "theo dõi sản phẩm này." Xác định định danh sản phẩm, biến thể, khu vực, bối cảnh giao hàng, nguồn và điều kiện cảnh báo.
inventory_job = {
"canonical_product_id": "catalog-7821",
"gtin": "0099999999999",
"variant": {
"color": "black",
"size": "M",
},
"market": "US",
"destination_postal_code": "94107",
"sources": [
"merchant_inventory_feed",
"marketplace_api",
"authorized_product_page",
],
"alert_on": ["OUT_OF_STOCK_TO_IN_STOCK"],
}
Bài viết blog thương mại điện tử của CapSolver https://www.capsolver.com/blog/ecommerce đề cập đến các quy trình thương mại liên quan, và Câu hỏi thường gặp về thu thập dữ liệu web của CapSolver giải thích các yếu tố vận hành cho việc thu thập dữ liệu công khai được phép.
Các nguồn chính thức thường ổn định hơn và dễ kiểm toán hơn. Sử dụng nguồn cấp dữ liệu nhà bán hàng, API người bán, điểm cuối tồn kho thị trường và nhà cung cấp danh mục được cấp phép trước khi đọc trang dành cho người mua.
Tài liệu API eBay Browse API hỗ trợ tìm kiếm sản phẩm theo từ khóa, danh mục, ePID, GTIN, tình trạng và các bộ lọc khác. Đối với các cửa hàng công khai trang sản phẩm được cấu trúc, Schema.org Offer định nghĩa các trường như availability, price, priceCurrency, seller và số lượng khả dụng. Tài liệu Product structured data documentation của Google giải thích cách dữ liệu đề xuất và khả dụng có thể xuất hiện trong ghi chú sản phẩm.
| Nguồn | Vai trò được khuyến khích | Điểm mạnh chính | Hạn chế chính |
|---|---|---|---|
| Nguồn cấp dữ liệu tồn kho nhà bán hàng | Chính cho danh mục của bạn | Dữ liệu SKU và số lượng trực tiếp | Giới hạn trong mối quan hệ thương mại của bạn |
| API thị trường | Chính cho các danh mục thị trường được phê duyệt | Các định danh và bộ lọc có cấu trúc | Giới hạn và trường đặc thù thị trường |
| Nhà cung cấp được cấp phép | Chuẩn hóa chéo thị trường | Mô hình nhất quán | Chi phí giấy phép và phạm vi bao phủ |
| Trang công khai được ủy quyền | Xác minh và bù đắp khoảng trống | Phản ánh trạng thái dành cho người mua | Thay đổi giao diện và xác minh lưu lượng |
Việc thu thập từ trình duyệt nên xác minh hoặc bổ sung cho khoảng trống dữ liệu đã biết, không thay thế cho nguồn chính thức có sẵn.
Trường in_stock: true thông thường là không đủ. Bảo tồn biến thể, kênh, thị trường, người bán và bằng chứng.
from dataclasses import dataclass, field
from datetime import datetime, timezone
@dataclass
class InventoryObservation:
source: str
canonical_product_id: str
source_item_id: str | None
gtin: str | None
variant: dict[str, str]
market: str
seller_id: str | None
availability: str
quantity: int | None
quantity_confidence: str
delivery_method: str | None
store_id: str | None
source_url: str | None
evidence: dict
parser_version: str
observed_at: str = field(
default_factory=lambda: datetime.now(timezone.utc).isoformat()
)
Sử dụng từ vựng khả dụng được kiểm soát:
VALID_AVAILABILITY = {
"IN_STOCK",
"OUT_OF_STOCK",
"PREORDER",
"BACKORDER",
"LIMITED",
"UNKNOWN",
}
Nếu trang chỉ nói "có sẵn", ghi số lượng là None. Không suy luận giá trị số.
Bài viết hướng dẫn thu thập dữ liệu web bằng Python của CapSolver cung cấp bối cảnh triển khai, trong khi từ điển thuật ngữ của CapSolver có thể giúp các nhóm chuẩn hóa thuật ngữ.
Bộ phân tích nên xác minh danh tính trang trước khi đọc dữ liệu tồn kho. Một trang thử thách có thể trả về HTTP 200 nhưng vẫn không chứa bất kỳ phần tử sản phẩm nào mong đợi.
CHALLENGE_TITLES = {
"just a moment...",
"attention required!",
}
async def classify_page(page) -> str:
title = (await page.title()).strip().lower()
html = (await page.content()).lower()
if title in CHALLENGE_TITLES:
return "CLOUDFLARE_CHALLENGE"
if "cf-chl-" in html or "challenge-platform" in html:
return "CLOUDFLARE_CHALLENGE"
if await page.locator('[data-product-id]').count():
return "PRODUCT_PAGE"
return "UNKNOWN_PAGE"
Xem các dấu hiệu này như tín hiệu định tuyến, không phải bằng chứng phổ quát. Duy trì các bộ thử nghiệm cụ thể cho mục tiêu và kiểm tra chúng với các trang bạn được phép truy cập.
Trang sản phẩm CapSolver Cloudflare mô tả nhiệm vụ thử thách được hỗ trợ, và bài viết blog Cloudflare của CapSolver chứa bối cảnh khắc phục sự cố.
Tài liệu Cloudflare Challenge chính thức của CapSolver định nghĩa AntiCloudflareTask.
| Trường | Bắt buộc | Sử dụng theo dõi tồn kho |
|---|---|---|
type |
Có | Cố định là AntiCloudflareTask |
websiteURL |
Có | URL chính xác của sản phẩm hoặc danh mục được phê duyệt |
proxy |
Có | Proxy tĩnh hoặc duy trì được sử dụng bởi trình duyệt |
userAgent |
Không | User agent Chrome được hỗ trợ chính xác từ trình duyệt |
html |
Không | HTML trung gian mới khi mục tiêu yêu cầu |
Giải pháp có thể bao gồm cookie cf_clearance, token và user agent. Những giá trị này là tài liệu phiên ngắn hạn. Chúng nên được sử dụng bởi runtime theo dõi, không được lưu trữ trong kho phân tích.
Tài liệu Challenges của Cloudflare giải thích mục đích và loại cơ chế thử thách. Khả năng kỹ thuật không cấp quyền truy cập, vì vậy chính sách nguồn vẫn là quy tắc kiểm soát.
Không tiết lộ thông tin xác thực proxy cho nhân viên phân tích, mô hình, nhật ký hoặc cảnh báo. Giải quyết một hồ sơ bên trong mã tin cậy.
import os
from urllib.parse import urlparse
import capsolver
capsolver.api_key = os.environ["CAPSOLVER_API_KEY"]
SOURCE_POLICY = {
"shop.example.com": {
"proxy_profile": "inventory_us_west",
"max_checks_per_hour": 4,
}
}
PROXY_VAULT = {
"inventory_us_west": os.environ["INVENTORY_PROXY_US_WEST"],
}
def approved_host(url: str) -> str:
host = urlparse(url).hostname
if host not in SOURCE_POLICY:
raise PermissionError("Inventory source is not approved")
return host
def solve_cloudflare_challenge(
url: str,
chrome_user_agent: str,
fresh_html: str = "",
) -> dict:
host = approved_host(url)
profile = SOURCE_POLICY[host]["proxy_profile"]
task = {
"type": "AntiCloudflareTask",
"websiteURL": url,
"proxy": PROXY_VAULT[profile],
"userAgent": chrome_user_agent,
}
if fresh_html:
task["html"] = fresh_html
solution = capsolver.solve(task)
cookies = solution.get("cookies") or {}
clearance = cookies.get("cf_clearance") or solution.get("token")
if not clearance:
raise RuntimeError("Challenge solution did not include clearance")
return {
"cookies": cookies,
"user_agent": solution.get("userAgent") or chrome_user_agent,
"proxy_profile": profile,
}
Sử dụng proxy tĩnh hoặc duy trì. Không xoay vòng danh tính mạng giữa điều hướng ban đầu, giải quyết và khôi phục trang.
Tạo ngữ cảnh Playwright với proxy và user agent được phê duyệt, ghi lại trạng thái thử thách, nhận giải pháp và áp dụng cookie trong ngữ cảnh phù hợp.
from urllib.parse import urlparse
async def recover_inventory_page(browser, url: str):
host = approved_host(url)
profile = SOURCE_POLICY[host]["proxy_profile"]
proxy = PROXY_VAULT[profile]
bootstrap_context = await browser.new_context(
proxy={"server": proxy},
)
bootstrap_page = await bootstrap_context.new_page()
await bootstrap_page.goto(url, wait_until="domcontentloaded")
state = await classify_page(bootstrap_page)
if state != "CLOUDFLARE_CHALLENGE":
return bootstrap_context, bootstrap_page, False
user_agent = await bootstrap_page.evaluate("navigator.userAgent")
html = await bootstrap_page.content()
solution = solve_cloudflare_challenge(
url=url,
chrome_user_agent=user_agent,
fresh_html=html,
)
await bootstrap_context.close()
context = await browser.new_context(
proxy={"server": proxy},
user_agent=solution["user_agent"],
)
cookie_domain = urlparse(url).hostname
await context.add_cookies([
{
"name": name,
"value": value,
"domain": cookie_domain,
"path": "/",
"secure": True,
"httpOnly": True,
}
for name, value in solution["cookies"].items()
])
page = await context.new_page()
await page.goto(url, wait_until="domcontentloaded")
return context, page, True
Các định dạng proxy khác nhau yêu cầu các trường Playwright khác nhau. Phân tích máy chủ proxy, tên người dùng và mật khẩu bên trong bộ chuyển tiếp kho khi cần.
Ưu tiên JSON-LD hoặc hợp đồng trang ổn định thay vì văn bản trình bày.
import json
SCHEMA_AVAILABILITY = {
"https://schema.org/InStock": "IN_STOCK",
"https://schema.org/OutOfStock": "OUT_OF_STOCK",
"https://schema.org/PreOrder": "PREORDER",
"https://schema.org/BackOrder": "BACKORDER",
"InStock": "IN_STOCK",
"OutOfStock": "OUT_OF_STOCK",
}
async def read_jsonld_offers(page) -> list[dict]:
blocks = await page.locator(
'script[type="application/ld+json"]'
).all_text_contents()
offers = []
for raw in blocks:
try:
data = json.loads(raw)
except json.JSONDecodeError:
continue
nodes = data if isinstance(data, list) else [data]
for node in nodes:
if not isinstance(node, dict):
continue
offer = node.get("offers")
if isinstance(offer, dict):
offers.append(offer)
elif isinstance(offer, list):
offers.extend(x for x in offer if isinstance(x, dict))
return offers
Chuẩn hóa khả dụng mà không tạo ra số lượng:
def normalize_offer_availability(offer: dict) -> tuple[str, int | None]:
raw = str(offer.get("availability", ""))
availability = SCHEMA_AVAILABILITY.get(raw, "UNKNOWN")
inventory_level = offer.get("inventoryLevel")
quantity = None
if isinstance(inventory_level, dict):
value = inventory_level.get("value")
if isinstance(value, int) and value >= 0:
quantity = value
return availability, quantity
Lưu trữ băm của bằng chứng liên quan và phiên bản bộ phân tích. Điều này làm cho cảnh báo có thể lặp lại mà không cần lưu trữ nội dung trang không cần thiết.
Cảnh báo về chuyển đổi, không phải các bản chụp lặp lại.
def inventory_transition(previous: str, current: str) -> str | None:
if previous == current:
return None
if previous in {"OUT_OF_STOCK", "UNKNOWN"} and current == "IN_STOCK":
return "RESTOCKED"
if previous == "IN_STOCK" and current == "OUT_OF_STOCK":
return "SOLD_OUT"
return "STATUS_CHANGED"
Yêu cầu hai quan sát khi nguồn có nhiễu:
def confirmed_transition(observations: list[InventoryObservation]) -> str | None:
if len(observations) < 3:
return None
older, previous, current = observations[-3:]
if previous.availability != current.availability:
return None
return inventory_transition(older.availability, current.availability)
Mẫu thứ hai giảm cảnh báo do lỗi bộ phân tích hoặc trạng thái trang tạm thời. Điều chỉnh quy tắc theo nhịp độ cập nhật của nguồn.
Một sự kiện thử thách là tín hiệu cơ sở hạ tầng. Nó không phải là thay đổi tồn kho.
| Chỉ số | Ý nghĩa | Địa điểm cảnh báo |
|---|---|---|
inventory_restock_total |
Chuyển đổi từ không có sẵn sang có sẵn được xác nhận | Bộ phận thương mại |
inventory_unknown_total |
Bộ phân tích không thể xác định khả dụng | Hàng đợi chất lượng dữ liệu |
challenge_encounter_total |
Trang được phê duyệt hiển thị thử thách | Bộ phận tự động hóa |
challenge_recovery_success |
Phục hồi hoàn tất và trang sản phẩm được trả về | Bảng điều khiển độ tin cậy |
challenge_loop_total |
Trang vẫn bị thử thách sau khi phục hồi | Xem xét của người vận hành |
Không bao giờ phân loại trang thử thách, lỗi HTTP hoặc bộ chọn trống là OUT_OF_STOCK.
The FAQ lỗi của CapSolver cung cấp hướng dẫn chẩn đoán, và blog tự động hóa của CapSolver đề cập đến các mẫu khôi phục liên quan.
Mã thưởng: Sử dụng mã WEBS tại Bảng điều khiển CapSolver để nhận thêm 5% thưởng cho mỗi lần nạp tiền.
| Kiểm soát | Triển khai được khuyến nghị |
|---|---|
| Quyền truy cập nguồn | Ghi chú phê duyệt theo máy chủ và giới hạn mục đích |
| Ưu tiên nguồn | Nguồn cấp dữ liệu hoặc API trước khi chuyển sang trình duyệt |
| Proxy | Máy chủ được giải quyết phía máy chủ, hồ sơ tĩnh hoặc dính |
| User agent | Cùng một danh tính Chrome được hỗ trợ qua khôi phục |
| Cookies | Lưu trữ mã hóa có thời hạn ngắn; không lưu trữ dữ liệu phân tích |
| Thử lại | Một lần khôi phục, sau đó là xem xét bởi người vận hành |
| Giới hạn tốc độ | Quota riêng cho nguồn với backoff và jitter |
| Cảnh báo | Thông báo chỉ đọc theo mặc định |
| Hành động có ảnh hưởng lớn | Xác nhận rõ ràng trước khi đặt hàng hoặc mua sắm |
Sử dụng FAQ giải quyết CAPTCHA của CapSolver để hiểu luồng công việc và trang sản phẩm của CapSolver để xem danh mục giải pháp được hỗ trợ.
Chỉ theo dõi các nguồn bạn được phép truy cập. Tuân theo giấy phép API thị trường, điều khoản nhà bán hàng, giới hạn tốc độ, yêu cầu bảo mật, và hợp đồng dữ liệu tồn kho. Không sử dụng khôi phục thách thức để truy cập tài khoản riêng, bảng điều khiển nhà bán hàng bị hạn chế, hồ sơ người mua, hoặc tồn kho không công khai. Giữ hệ thống ở chế độ chỉ đọc trừ khi một dịch vụ được phê duyệt riêng xử lý đặt hàng hoặc thanh toán với sự đồng ý rõ ràng của con người.
Khôi phục thách thức Cloudflare có thể làm cho việc theo dõi tồn kho thương mại điện tử đáng tin cậy hơn, nhưng chỉ khi nó nằm trong luồng dữ liệu được ưu tiên API, nhận biết biến thể và kiểm soát bởi chính sách. Bộ theo dõi nên xác minh danh tính trang, duy trì nhất quán proxy và user-agent, tiêu thụ cookie giải phóng trong thời gian ngắn, phân tích bằng chứng tồn kho có cấu trúc, và tách biệt sự cố cơ sở hạ tầng khỏi thay đổi tồn kho thực sự.
Khởi động quy trình được phê duyệt với CapSolver, kiểm tra nó với nguồn được kiểm soát, và thêm lưu trữ bằng chứng, giới hạn tốc độ, và xem xét người vận hành trước khi mở rộng.
Không. Ưu tiên các nguồn cấp dữ liệu nhà bán hàng, API thị trường, API nhà bán hàng, và các nguồn dữ liệu được cấp phép. Chỉ sử dụng trình duyệt được phê duyệt cho các khoảng trống được phép hoặc xác minh phía người mua.
Sử dụng nhiệm vụ AntiCloudflareTask được tài liệu hóa với URL đích chính xác và proxy tĩnh hoặc dính. Các trường tùy chọn bao gồm user agent Chrome được hỗ trợ của trình duyệt và HTML thách thức mới.
Không. Trang thách thức, trang lỗi hoặc bộ chọn bị thiếu là trạng thái cơ sở hạ tầng hoặc bộ phân tích. Ghi lại UNKNOWN và định tuyến riêng biệt khỏi các chuyển tiếp tồn kho.
Chỉ lưu chúng trong bộ nhớ thời gian ngắn mã hóa. Không đặt chúng vào ngữ cảnh mô hình, bảng phân tích, thông báo hoặc nhật ký dài hạn.
Giữ theo dõi ở chế độ chỉ đọc theo mặc định. Đặt hàng, thanh toán và mua sắm yêu cầu một dịch vụ được phê duyệt riêng, xác minh giá mới, giới hạn chính sách và xác nhận rõ ràng từ con người.
Sửa một token Turnstile không hợp lệ bằng cách kiểm tra hết hạn, mã trang web, hành động, cdata, trạng thái trình duyệt, xác minh máy chủ và số lần thử lại CapSolver giới hạn.

Xây dựng một quy trình có kiểm soát theo chính sách MCP Cloudflare Turnstile với CapSolver, lặp lại có giới hạn, nhật ký đã được làm mờ, kiểm tra phiên làm việc và xác minh kết quả.
