lxml proxy tải HTML và kiểm tra sản phẩm bằng XPath
lxml proxy cần tách bước tải HTML khỏi bước truy vấn XPath và chuẩn hóa bản ghi. Đặt đúng endpoint chỉ giải quyết tuyến kết nối; dữ liệu vẫn cần được kiểm tra trước khi xuất tệp. ProxyVN hướng dẫn dựng parser danh mục có giá tiền, giữ đúng quan hệ trường và chạy mười hai phép thử fixture để anh em dễ tái hiện kết quả.
lxml proxy và thiết kế luồng dữ liệu danh mục
Ví dụ trong bài giải quyết một nhiệm vụ cụ thể: nhận HTML danh mục rồi xuất các dòng gồm SKU, tiêu đề, giá, đơn vị tiền và URL. Đường mạng được giao cho Requests; lxml nhận bytes đã tải. Quyết định này giúp thay endpoint hoặc cách tải mà không phải viết lại toàn bộ quy tắc đọc sản phẩm.
Xác định hợp đồng trước selector
Một bản ghi được chấp nhận khi có SKU, đúng một liên kết tiêu đề và đúng một phần tử giá. Giá trong fixture dùng dạng máy đọc được qua data-price, còn data-currency xác định đơn vị. Chương trình không tự đoán tiền tệ từ ký hiệu trên màn hình vì một ký hiệu có thể xuất hiện trong nhiều ngữ cảnh khác nhau.
Giá không âm được chấp nhận, kể cả giá bằng không. Quy tắc này ngăn lỗi thường gặp khi dùng điều kiện kiểm tra theo tính đúng sai của số: số không là dữ liệu hợp lệ nhưng có thể bị hiểu nhầm thành thiếu. Tiêu đề và liên kết thì phải có nội dung, không được thay bằng giá trị mặc định để làm đủ cột.
Tách trách nhiệm của từng thành phần
Tài liệu lxml.html trình bày cách tạo cây HTML từ chuỗi hoặc bytes. Ví dụ chủ động tải dữ liệu ở bên ngoài rồi đưa vào fromstring, thay vì yêu cầu parser mở một địa chỉ mạng. Nhờ đó, thông tin proxy nằm tại một nơi có thể quan sát và kiểm tra riêng.
Nếu cần ôn tầng kết nối, anh em có thể đọc web scraping proxy hoạt động thế nào. Bài này tập trung vào XPath theo phạm vi card và các điều kiện dữ liệu. Không coi việc nhận HTTP 200 là bằng chứng đã thu thập đúng danh mục cần dùng.
Hãy kiểm tra một bản ghi như một đơn vị có quan hệ giữa các trường; đủ số cột vẫn chưa chứng minh các cột thuộc cùng một sản phẩm.
lxml proxy với môi trường và fixture giá tiền
Một fixture nhỏ giúp kiểm tra những trường hợp cần xử lý trước khi kết nối tới nguồn thật. Anh em có thể chạy lại cùng HTML sau mỗi lần sửa XPath và đối chiếu kết quả theo từng trường. Trong bài, toàn bộ sản phẩm và giá là dữ liệu giả lập, không phải mẫu thu thập từ khách hàng hay cửa hàng bên ngoài.
Ghi phiên bản đã kiểm tra
Môi trường parser được dùng để chạy bộ thử gồm Python 3.12.14, lxml 6.1.1 và libxml2 2.11.9. Các con số này ghi lại môi trường thử cụ thể, không phải yêu cầu mọi máy phải có cùng bản libxml2. Khi cài wheel hoặc tự biên dịch, hãy ghi cả hai phiên bản thư viện để có căn cứ khi so sánh.
python -m venv .venv
# Kích hoạt môi trường riêng trước khi cài
python -m pip install lxml==6.1.1 requests==2.32.5
python -m pip freeze > requirements-lock.txt
Không thay môi trường của tác vụ đang chạy chỉ để thử ví dụ. Hãy giữ mã mẫu và fixture trong thư mục riêng, rồi lưu phụ thuộc bên cạnh. Nếu môi trường khác phát sinh lỗi, chạy parser trên fixture trước; cách đó giúp phân biệt vấn đề cài đặt với thay đổi trên website đích.
Tạo hai card có chủ đích
Lưu đoạn sau thành products.html với mã hóa UTF-8. Card đầu có chữ lồng trong thẻ b để kiểm tra cách lấy nội dung tiêu đề. Card thứ hai có giá bằng không để kiểm tra chính sách dữ liệu, tránh một phép kiểm tra sơ sài loại bỏ bản ghi chỉ vì không phát sinh chi phí.
<!doctype html><html><head><meta charset="utf-8"></head><body>
<article data-sku="P01"><h2><a href="/p/one">Sổ <b>giấy</b></a></h2>
<span data-price="12.50" data-currency="USD">$12.50</span></article>
<article data-sku="P02"><h2><a href="/p/two">Bút chì</a></h2>
<span data-price="0" data-currency="USD">Miễn phí</span></article>
</body></html>
URL cơ sở trong kiểm thử là địa chỉ minh họa fixture.example, không phải một nguồn cần truy cập. Hàm phân tích chỉ dùng nó để ghép đường dẫn tương đối thành URL đầy đủ. Khi đưa parser vào nguồn thật, URL cơ sở cần phản ánh trang phản hồi đang đọc và chính sách chuyển hướng của tầng tải.

Fixture có giá bằng không
lxml proxy và XPath theo phạm vi sản phẩm
Một truy vấn XPath rộng có thể lấy đủ dữ liệu nhưng ghép sai quan hệ. Cách an toàn hơn cho fixture này là chọn các card trước, sau đó tìm liên kết và giá trong từng card. Khi một card có hai giá mà hợp đồng chỉ cho phép một giá, chương trình báo mơ hồ để người viết quyết định quy tắc.
Dựng parser có kiểm tra số phần tử
Lưu đoạn dưới thành lxml_products.py. Mã này do bài hướng dẫn xây dựng để xử lý fixture, không phải đoạn sao chép một bộ thu thập thương mại. Các tên lỗi mô tả điều kiện bị từ chối, giúp bộ kiểm thử xác nhận chương trình dừng đúng lý do thay vì chỉ kiểm tra có exception bất kỳ.
from decimal import Decimal
from urllib.parse import urljoin, urlsplit
from lxml import html
import re
def parse_products(content, page_url):
parser = html.HTMLParser(no_network=True)
tree = html.fromstring(content, parser=parser)
cards = tree.xpath('//article[@data-sku]')
if not cards:
raise ValueError('NO_PRODUCTS')
rows, seen = [], set()
for card in cards:
sku = (card.get('data-sku') or '').strip()
links = card.xpath('.//h2/a')
prices = card.xpath('.//*[@data-price]')
if not sku or len(links) != 1 or len(prices) != 1:
raise ValueError('AMBIGUOUS_OR_MISSING_FIELD')
title = ' '.join(links[0].text_content().split())
href = links[0].get('href')
raw_price = prices[0].get('data-price', '')
currency = prices[0].get('data-currency')
if not title or not href:
raise ValueError('MISSING_TITLE_OR_LINK')
if not re.fullmatch(r'[0-9]+(?:\.[0-9]{1,2})?', raw_price):
raise ValueError('INVALID_PRICE')
if currency != 'USD':
raise ValueError('UNSUPPORTED_CURRENCY')
url = urljoin(page_url, href)
if urlsplit(url).scheme not in ('http', 'https'):
raise ValueError('INVALID_LINK')
if sku in seen:
raise ValueError('DUPLICATE_SKU')
seen.add(sku)
rows.append({
'sku': sku,
'title': title,
'price': format(Decimal(raw_price), '.2f'),
'currency': currency,
'url': url,
})
return rows
Phép kiểm tra len không chọn tùy tiện giá đầu tiên khi card có cả giá niêm yết và giá khuyến mại. Nguồn thật có thể cần cả hai trường, nhưng khi đó phải mở rộng schema và fixture. Không nên bỏ điều kiện kiểm tra chỉ để parser chạy qua một cấu trúc chưa được hiểu.
Giữ dấu chấm trước truy vấn con
Tài liệu XPath của lxml giải thích cách đánh giá biểu thức tương đối trên phần tử. Trong ví dụ, dấu chấm ở .//h2/a giữ truy vấn dưới card đang xét. Việc đổi sang truy vấn bắt đầu từ gốc có thể khiến vòng lặp đọc lại liên kết ở những card khác.
Anh em nên giữ một ca thử gồm hai sản phẩm khác tiêu đề và khác URL. Ca này giúp phát hiện việc cả hai dòng cùng nhận dữ liệu của sản phẩm đầu tiên. Nếu chỉ thử một card, lỗi phạm vi truy vấn có thể không lộ ra dù kết quả nhìn có vẻ đúng.
Tránh gắn logic vào thứ tự trình bày
Không lấy cột thứ nhất hoặc phần tử thứ hai chỉ vì fixture đang có cấu trúc ấy. Hãy ưu tiên dấu hiệu có ý nghĩa như data-sku và data-price khi nguồn cung cấp. Nếu website thật không có các thuộc tính này, cần chọn dấu hiệu phù hợp với HTML thực tế rồi kiểm tra tính ổn định bằng mẫu đại diện.
Những thuộc tính trong bài là hợp đồng của fixture, không phải selector dùng chung cho mọi website bán hàng. Sao chép nguyên parser sang một sàn khác thường không tạo ra kết quả đúng. Điều có thể tái sử dụng là cách chọn card, xác nhận số phần tử và kiểm tra từng trường trước khi thêm vào danh sách.
Giữ bản gốc khi chuẩn hóa khoảng trắng
Thao tác split rồi join trong ví dụ gom các khoảng trắng liên tiếp thành một dấu cách trong tiêu đề. Đây là quy tắc phù hợp cho fixture danh mục ngắn, nhưng có thể không phù hợp với văn bản cần giữ xuống dòng. Nếu nghiệp vụ phải lưu tiêu đề nguyên bản, hãy tạo trường title_raw bên cạnh trường chuẩn hóa thay vì thay đổi nội dung gốc không thể truy lại.
Tương tự, đừng xóa mọi ký tự ngoài chữ và số để làm dữ liệu trông sạch. Tên sản phẩm có thể chứa dấu gạch, ký hiệu phiên bản hoặc kích thước có ý nghĩa. Một quy tắc làm sạch quá mạnh có thể biến hai sản phẩm khác nhau thành cùng một tên, khiến bước khử trùng phía sau gộp nhầm dữ liệu.
Chấp nhận hay cách ly bản ghi lỗi
Parser hiện dừng cả trang khi gặp một card sai. Cách này phù hợp với mục tiêu thử hợp đồng nghiêm ngặt của fixture, nhưng một hệ thống lớn có thể cần giữ những dòng tốt. Nếu đổi chính sách, hãy trả hai danh sách riêng: bản ghi hợp lệ và lỗi kèm vị trí card, đồng thời đánh dấu lô có dữ liệu bị loại.
Không gắn tên sản phẩm gần nhất cho một card thiếu tiêu đề để tiếp tục chạy. Việc đó tạo ra dữ liệu sai có vẻ hợp lệ và khó phát hiện hơn một lỗi rõ ràng. Với bản ghi cách ly, lưu mã nguồn, vị trí card và loại lỗi đủ để người kiểm tra tái hiện, tránh lưu thêm bí mật phiên không cần thiết.
lxml proxy với giá tiền và URL đầu ra
Dữ liệu giá cần giữ được ý nghĩa sau khi chuyển từ HTML sang JSON hoặc CSV. Trong ví dụ, chuỗi số chỉ chấp nhận chữ số ASCII và tối đa hai chữ số thập phân. Dấu phẩy, khoảng trắng hoặc ký hiệu tiền trong data-price đều bị từ chối để tránh đoán sai quy tắc theo vùng.
Giữ số thập phân dưới dạng chuỗi
Mã dùng Decimal rồi xuất giá thành chuỗi có hai chữ số sau dấu chấm. Tài liệu decimal của Python cung cấp nền tảng cho phép tính thập phân khi cần giữ độ chính xác theo quy tắc số. Trong fixture, giá 12.50 được lưu thành chuỗi 12.50, còn giá 0 trở thành 0.00.
Việc xuất chuỗi giúp nơi nhận dữ liệu biết cách diễn giải giá mà không phụ thuộc định dạng hiển thị của một phần mềm bảng tính. Tuy nhiên, không nên cộng trực tiếp các chuỗi trong báo cáo. Tầng phân tích cần đọc lại theo schema đã ghi rõ, giữ đơn vị tiền đi cùng từng giá trước khi thực hiện phép tính.
Không suy đoán đơn vị từ ký hiệu
UNSUPPORTED_CURRENCY xuất hiện khi dữ liệu không mang USD theo hợp đồng hiện tại. Đây là giới hạn của ví dụ để làm rõ xử lý, không phải hạn chế của lxml. Nếu nguồn có EUR hoặc VND, hãy bổ sung tập đơn vị được hỗ trợ và quy tắc số chữ số thập phân tương ứng, rồi kiểm tra từng trường hợp.
Không đổi một giá EUR thành USD chỉ bằng cách sửa nhãn trong kết quả. Chuyển đổi tiền tệ cần tỷ giá, thời điểm và chính sách làm tròn riêng. Với dữ liệu thu thập, cách ít gây nhầm lẫn hơn là giữ giá gốc cùng đơn vị gốc, rồi tạo một trường quy đổi ở bước phân tích nếu nghiệp vụ thực sự cần.
Phân biệt URL dữ liệu với URL được phép tải
Kiểm tra scheme trong parser chỉ bảo đảm kết quả có dạng HTTP hoặc HTTPS. Nó chưa giới hạn miền, địa chỉ nội bộ hay quyền truy cập. Trong ví dụ, URL được xuất như một trường dữ liệu; chương trình chưa tự mở từng trang chi tiết vừa tìm thấy.
Nếu thêm bước tải chi tiết, cần đặt chính sách miền được phép và chuyển hướng tại tầng tải. Đừng hiểu rằng một URL vượt qua parser có thể được worker truy cập không cần kiểm tra. Đặc biệt, khi chương trình chạy trong hạ tầng có dịch vụ nội bộ, danh sách mục tiêu phải được kiểm soát trước mỗi yêu cầu mạng.

Một card một bản ghi
lxml proxy và tầng tải HTML có cấu hình rõ
Sau khi parser hoạt động với fixture, anh em có thể thêm HTTP client. Đoạn dưới là ví dụ triển khai cho endpoint HTTP hoặc HTTPS, lấy cấu hình qua biến môi trường. Phần này chưa được thử với endpoint thương mại trong bộ kiểm tra của bài; cần nghiệm thu riêng bằng đích được phép trước khi dùng thật.
Cấu hình Requests bên ngoài parser
Phần proxy của Requests mô tả tham số proxies cho yêu cầu mạng. Ví dụ đặt cùng endpoint cho hai scheme đích, giữ kiểm tra TLS và không tự theo redirect. Người vận hành cần xác nhận định dạng endpoint và phương thức xác thực đã được nhà cung cấp cấp cho tài khoản của mình.
import os
import requests
from lxml_products import parse_products
def download_products(target, proxy_url):
if not target.startswith('https://'):
raise ValueError('HTTPS_TARGET_REQUIRED')
with requests.Session() as session:
session.trust_env = False
with session.get(
target,
proxies={'http': proxy_url, 'https': proxy_url},
timeout=(5, 15), allow_redirects=False,
stream=True, headers={'Accept': 'text/html'},
) as response:
response.raise_for_status()
if response.status_code != 200:
raise ValueError('UNEXPECTED_STATUS')
content_type = response.headers.get('Content-Type', '')
if 'text/html' not in content_type.lower():
raise ValueError('EXPECTED_HTML')
content = bytearray()
for part in response.iter_content(8192):
content.extend(part)
if len(content) > 2 * 1024 * 1024:
raise ValueError('BODY_TOO_LARGE')
return parse_products(bytes(content), response.url)
# Chỉ gọi sau khi đã cấp cấu hình và xác minh quyền truy cập.
# rows = download_products(os.environ['TARGET_URL'], os.environ['PROXY_URL'])
Giới hạn kích thước hai MiB và timeout trong ví dụ là lựa chọn khởi đầu cho tài liệu nhỏ, không phải mức phù hợp cho mọi danh mục. Hãy đo dữ liệu đại diện rồi điều chỉnh. Đừng tăng hạn mức hàng loạt khi nguyên nhân thực tế là đang tải nhầm trang hoặc nhận tài liệu lỗi quá lớn.
Quản lý thông tin xác thực
Biến môi trường tránh ghi tài khoản vào mã nguồn, nhưng vẫn cần được cấp qua cơ chế quản lý bí mật của môi trường chạy. Không đưa URL chứa mật khẩu vào nhật ký exception gửi ra công cụ theo dõi. Nhật ký chỉ nên chứa mã endpoint, loại lỗi và mã tác vụ để người có quyền tra cấu hình riêng.
Khi sửa lỗi xác thực, chỉ đổi một yếu tố mỗi lần: định dạng endpoint, thông tin tài khoản hoặc chính sách truy cập. Thay đồng thời cả proxy, selector và phiên bản thư viện sẽ làm bằng chứng khó đối chiếu. Sau mỗi thay đổi mạng, chạy lại cùng fixture qua tuyến thử để giữ điều kiện so sánh ổn định.
Giới hạn trách nhiệm của no_network
Theo tài liệu parser của lxml, no_network liên quan tới việc parser truy xuất tài liệu bên ngoài. Tham số này được đặt rõ trong parser mẫu; nó không thay thế cấu hình proxy cho Requests. Hai thành phần hoạt động ở hai vị trí khác nhau trong luồng xử lý.
Bài chỉ phân tích HTML và không trình bày một cấu hình XML dùng chung cho mọi dữ liệu không tin cậy. Nếu nghiệp vụ chuyển sang XML, cần xem lại DTD, entity, kích thước và các tùy chọn parser phù hợp. Không mặc định mọi quy tắc xử lý HTML có thể chuyển nguyên sang XML mà không đánh giá lại.
lxml proxy với mười hai phép thử fixture
Bộ kiểm tra của bài đã chạy trên parser và dữ liệu mẫu, không gọi website thương mại. Cách giới hạn này giúp assertion lặp lại ổn định và không phụ thuộc chất lượng endpoint. Kiểm thử đường mạng vẫn là một hạng mục riêng cần thực hiện trong môi trường triển khai được phép.
Kiểm tra các giá trị phải giữ đúng
Năm kiểm tra đầu xác nhận số dòng, tiêu đề có chữ lồng, chuỗi giá 12.50, giá không và URL tương đối. Các assertion không chỉ kiểm tra độ dài danh sách. Chúng đọc những trường có thể bị hỏng trong quá trình chuẩn hóa, giúp thay đổi mã nguồn được đánh giá bằng kết quả cụ thể.
from pathlib import Path
from lxml_products import parse_products
rows = parse_products(
Path('products.html').read_bytes(),
'https://fixture.example/catalog',
)
assert len(rows) == 2
assert rows[0]['title'] == 'Sổ giấy'
assert rows[0]['price'] == '12.50'
assert rows[1]['price'] == '0.00'
assert rows[1]['url'] == 'https://fixture.example/p/two'
print('valid fixture: PASS')
Bảy kiểm tra còn lại xác nhận parser từ chối trang không có sản phẩm, SKU trùng, giá NaN, sai đơn vị tiền, liên kết script, hai liên kết tiêu đề và thiếu trường giá. Tất cả mười hai kiểm tra đã đạt trong môi trường ghi phía trên. Báo cáo này chỉ nói về các trường hợp được đưa vào fixture, không bao phủ mọi lỗi có thể xảy ra.
Kiểm tra đúng lý do thất bại
Một phép thử dữ liệu lỗi nên xác nhận mã lỗi mong đợi. Nếu chỉ bọc toàn bộ chương trình bằng except rồi in PASS, lỗi import thư viện cũng có thể bị ghi nhầm thành parser đã chặn đúng dữ liệu. Đó là lý do các ca từ chối trong bộ thử đối chiếu cả loại exception và nội dung mã lỗi.
Khi bổ sung trường mới, hãy thêm cả ca dữ liệu đúng, thiếu và mơ hồ nếu cấu trúc có thể lặp. Chẳng hạn một card có nhiều biến thể giá cần cách chọn biến thể rõ ràng. Đừng sửa một assertion thành chấp nhận kết quả mới trước khi xác định thay đổi ấy là chủ đích hay lỗi phát sinh.

Mười hai phép thử parser
lxml proxy và chẩn đoán theo bằng chứng
Khi kết quả không đúng, hãy tìm tầng đầu tiên lệch khỏi hợp đồng thay vì sửa mọi thành phần cùng lúc. Đường mạng có thể thành công trong khi body là trang đăng nhập. XPath cũng có thể đúng cú pháp nhưng chọn nhầm một phần giao diện không chứa danh mục đang cần.
Dấu hiệu |
Điều cần kiểm tra |
Việc tiếp theo |
|---|---|---|
Lỗi kết nối proxy |
Endpoint và xác thực |
Thử tuyến được phép với cấu hình đã che bí mật |
EXPECTED_HTML |
Loại phản hồi |
Xem header và nguồn URL |
NO_PRODUCTS |
Body và selector card |
So HTML nhận được với fixture |
AMBIGUOUS_OR_MISSING_FIELD |
Cấu trúc từng card |
Đếm phần tử giá và liên kết |
INVALID_PRICE |
Định dạng trường máy đọc |
Xem giá gốc, không thay thành số không |
DUPLICATE_SKU |
Phạm vi định danh |
Xác định trùng thật hay biến thể sản phẩm |
Lưu mẫu lỗi có giới hạn
Một mẫu HTML được làm sạch có ích khi cần tái hiện selector, nhưng không nên ghi toàn bộ dữ liệu phiên vào nhật ký chung. Hãy loại thông tin cá nhân và bí mật không cần cho cấu trúc. Với lỗi do trang đăng nhập, có thể chỉ cần lưu mã trạng thái, loại nội dung và dấu hiệu nhận diện đã thống nhất.
Giữ mã fixture gắn với phiên bản parser để lần sửa sau có căn cứ so sánh. Nếu một nguồn đổi cấu trúc, lưu một mẫu mới và kiểm tra cả mẫu cũ khi hệ thống vẫn cần đọc dữ liệu lịch sử. Cách này tránh sửa cho trang mới nhưng làm hỏng đường xử lý đã dùng cho các nguồn khác.
Phát hiện dữ liệu suy giảm
Không chỉ theo dõi tỷ lệ request thành công. Hãy ghi số card nhìn thấy, số dòng chấp nhận và các nhóm từ chối theo từng lô. Nếu số dòng giảm mạnh trong khi status vẫn 200, người vận hành cần kiểm tra nội dung trước khi tăng retry hoặc thay tuyến.
Đối với trường tùy chọn bổ sung về sau, tỷ lệ thiếu cũng nên được quan sát. Một selector tác giả hoặc nhãn danh mục hỏng có thể không làm tác vụ thất bại nhưng giảm giá trị dữ liệu. Cần thống nhất ngưỡng cảnh báo dựa trên dữ liệu thực của nguồn, tránh lấy một tỷ lệ tùy ý rồi xem là tiêu chuẩn chung.
lxml proxy khi mở rộng và bàn giao tác vụ
Ví dụ một trang cần được mở rộng có kiểm soát trước khi xử lý hàng loạt. Hãy đặt giới hạn số trang, theo dõi URL đã truy cập và định nghĩa điều kiện kết thúc. Một vòng phân trang bị lặp không nên tiếp tục chỉ vì mỗi request riêng vẫn trả được HTML hợp lệ.
Khóa bản ghi và công bố kết quả
Tập seen trong parser chỉ kiểm tra SKU trùng trong một tài liệu. Nếu danh mục có nhiều trang, tầng điều phối cần kiểm tra khóa trên cả lô theo quy tắc nguồn. Với sản phẩm nhiều biến thể, có thể cần khóa ghép SKU và mã biến thể; quyết định này phải xuất phát từ dữ liệu, không từ mong muốn làm biến mất lỗi trùng.
Nên ghi kết quả vào tệp tạm và chỉ thay bản công bố khi lô đạt kiểm tra. Nếu dừng giữa chừng, giữ trạng thái partial cùng những trang đã xử lý. Đừng diễn giải việc một SKU chưa xuất hiện trong lô thiếu trang thành kết luận sản phẩm đã bị gỡ khỏi danh mục.
Chọn endpoint theo nhu cầu kiểm chứng
Trước khi mua proxy Việt Nam, anh em hãy xác định giao thức, cách xác thực và nguồn được phép thử. Dùng một mục tiêu nhỏ để kiểm tra tuyến, rồi đối chiếu parser bằng fixture. Đổi endpoint không sửa được giá sai định dạng hoặc XPath đang đọc nhầm phần tử.
Bàn giao nên kèm schema, fixture, phụ thuộc, mười hai kết quả thử và phạm vi chưa kiểm tra mạng thương mại. Người tiếp nhận cần biết cách cấp bí mật và cách xử lý lô thất bại. Những thông tin này giúp họ chạy lại có căn cứ trước khi đưa tác vụ vào lịch định kỳ.
Xuất JSON và CSV theo một schema
Khi xuất JSON, giữ giá dưới dạng chuỗi như parser trả về và ghi đơn vị tiền ở cột riêng. Không chuyển lại thành float chỉ để đầu ra nhìn giống số. Việc chuyển kiểu tùy tiện giữa parser và nơi lưu trữ làm hợp đồng bị thay đổi dù phần trích xuất HTML vẫn chạy đúng.
Với CSV, dùng thư viện ghi CSV để xử lý dấu phẩy, dấu ngoặc kép và xuống dòng trong tiêu đề. Nối chuỗi thủ công bằng dấu phẩy có thể tạo thêm cột khi tên sản phẩm chứa dấu phân cách. Khi mở bằng bảng tính, cần kiểm tra cách phần mềm diễn giải SKU có số không ở đầu và giá theo thiết lập vùng.
Giữ cùng thứ tự cột trong mỗi tệp của một phiên bản schema. Nếu bổ sung trường mới, ghi phiên bản để chương trình nhận dữ liệu biết có thay đổi. Không đổi tên cột từ price sang giá trong một lần chạy mà không thông báo; các tác vụ phía sau có thể dùng tên cột như một phần giao diện máy đọc.
Phân biệt bản cập nhật và sản phẩm mới
Một SKU xuất hiện lần nữa không nhất thiết là lỗi nếu đó là một lần thu thập khác. Trong phạm vi một trang, parser đang coi trùng là bất thường. Trong lịch sử nhiều lần chạy, cùng SKU có thể cần nhiều quan sát giá với thời điểm khác nhau, phục vụ theo dõi thay đổi thay vì khử hết mọi bản lặp.
Hãy tách khóa sản phẩm khỏi khóa quan sát. Khóa sản phẩm có thể là nguồn cùng SKU, còn khóa quan sát thêm mã lô hoặc thời điểm thu thập theo quy tắc hệ thống. Cách đặt khóa rõ ràng ngăn việc một cơ chế chống trùng vô tình xóa lịch sử giá mà người dùng báo cáo đang cần.
Khi giá thay đổi, giữ được bằng chứng thuộc lần chạy nào và parser phiên bản nào. Nếu thay đổi đến từ việc đổi selector, đó là sự kiện xử lý dữ liệu cần kiểm tra, chưa phải kết luận cửa hàng đã đổi giá. So fixture và mẫu nguồn trước khi gửi dữ liệu sang báo cáo biến động.

Bàn giao schema và bằng chứng
lxml proxy cần được nghiệm thu ở cả tuyến tải và chất lượng bản ghi. Anh em hãy giữ fixture, kiểm tra giá cùng SKU và chỉ công bố lô đã đạt điều kiện. Theo dõi Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để trao đổi cách triển khai phù hợp khi mở rộng lxml proxy.