Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
BeautifulSoup proxy tải HTML và kiểm tra dữ liệu bằng Python

BeautifulSoup proxy tải HTML và kiểm tra dữ liệu bằng Python

Chuyên viên Kỹ thuật ProxyVN 01-04-2026 Đang tính... phút đọc

BeautifulSoup proxy nên được triển khai bằng hai phần rõ ràng: Requests tải HTML qua máy chủ trung gian, BeautifulSoup đọc tài liệu đã nhận. Cách tách này giúp anh em sửa đúng lỗi kết nối hoặc lỗi selector. ProxyVN hướng dẫn xây dựng ví dụ có fixture, kiểm tra dữ liệu đầu ra và chín phép thử cục bộ trước khi đưa nguồn thật vào chương trình.

BeautifulSoup proxy và luồng xử lý hai tầng

Một chương trình thu thập danh sách bài viết cần trả lời hai câu khác nhau: tài liệu đến từ đâu và các trường trong tài liệu được đọc thế nào. Địa chỉ proxy thuộc câu đầu. Selector, trường bắt buộc và quy tắc khử trùng thuộc câu sau. Khi hai phần được kiểm tra riêng, việc đổi tuyến mạng không buộc anh em sửa bộ phân tích HTML.

Đầu vào và đầu ra của ví dụ

Bài này dùng danh sách bài viết giả lập gồm mã, tiêu đề, tác giả và URL chi tiết. Mã cùng tiêu đề là trường bắt buộc; tác giả được phép thiếu. Đầu ra phải giữ nguyên quan hệ giữa các trường của từng thẻ bài, tránh lấy toàn bộ tiêu đề rồi ghép với một danh sách tác giả khác chiều dài.

Dữ liệu mẫu do người viết tạo để kiểm tra chương trình, không phải dữ liệu khách hàng hay kết quả thu thập từ website bên ngoài. Hai bản ghi được cố ý thiết kế khác nhau: bản đầu có tác giả và chữ in đậm bên trong tiêu đề, bản sau không có tác giả. Những khác biệt nhỏ này giúp phát hiện lỗi chuẩn hóa thường bị bỏ sót.

Phân biệt tuyến tải và bộ phân tích

Theo tài liệu Beautiful Soup, thư viện làm việc với HTML hoặc XML đã được cung cấp. Trong ví dụ, Requests nhận trách nhiệm tải bytes, còn hàm parse_records nhận bytes và URL trang. Không truyền tham số proxies vào BeautifulSoup vì đó không phải HTTP client.

Anh em có thể đọc thêm về cơ chế web scraping proxy nếu chưa quen tầng kết nối. Phần còn lại tập trung vào hợp đồng dữ liệu của parser. Khi selector trả về rỗng, bước đầu tiên là kiểm tra nội dung nhận được, không phải đổi hàng loạt địa chỉ trung gian.

Một kết nối thành công chỉ xác nhận đã nhận phản hồi; bản ghi đúng còn phải vượt qua kiểm tra cấu trúc và trường dữ liệu.

BeautifulSoup proxy với fixture và môi trường tái lập

Hãy tạo thư mục riêng chứa mã nguồn, fixture và kết quả thử. Cách tổ chức này giúp người khác chạy parser mà không cần mật khẩu proxy hoặc quyền truy cập website thật. Khi lỗi xuất hiện sau một lần cập nhật phụ thuộc, fixture giữ nguyên sẽ cho biết thay đổi đến từ phần mềm hay từ tài liệu đầu vào.

Cài gói và ghi phiên bản

Môi trường kiểm thử của bài dùng Python 3.12.14, Requests 2.32.5 và beautifulsoup4 4.14.3. Đây là phiên bản đã chạy trong bộ thử cục bộ, không phải khẳng định phiên bản mới nhất. Nếu anh em dùng phiên bản khác, hãy ghi lại rồi chạy các ca kiểm tra trước khi so sánh hành vi.

python -m venv .venv
# Kích hoạt môi trường theo hệ điều hành đang dùng
python -m pip install requests==2.32.5 beautifulsoup4==4.14.3
python -m pip freeze > requirements-lock.txt

Lệnh cài đặt cần kết nối tới kho gói và nên chạy trong môi trường tách biệt. Không thay Python của ứng dụng đang vận hành chỉ để thử một bài hướng dẫn. Sau khi cài, lưu tệp phụ thuộc cạnh mã nguồn; bản ghi phiên bản có ích hơn một câu ghi chú chung rằng chương trình chạy trên Python mới.

Tạo trang danh sách nhỏ

Lưu đoạn sau thành records.html bằng UTF-8. Tên miền trong ví dụ là địa chỉ minh họa, còn đường dẫn tương đối giúp kiểm tra bước ghép URL. Thuộc tính data-record đóng vai trò định danh do bộ dữ liệu mẫu quy định, không phải quy ước bắt buộc của BeautifulSoup.

<!doctype html><html lang="vi"><meta charset="utf-8">
<title>Danh sách bài thử</title>
<article data-record="A01">
  <h2><a href="/bai-viet/ket-noi">Kiểm tra <b>kết nối</b></a></h2>
  <span class="author">Lê An</span>
</article>
<article data-record="A02">
  <h2><a href="/bai-viet/du-lieu">Đọc dữ liệu HTML</a></h2>
</article></html>

Trước khi tải qua mạng, mở fixture bằng trình soạn thảo và kiểm tra đủ hai thẻ article. Không dựa vào ảnh chụp trình duyệt để kết luận HTML chứa dữ liệu. Trong trang thật, JavaScript có thể tạo các phần tử sau khi tài liệu ban đầu đã được tải, khiến DOM nhìn thấy khác bytes nhận bởi Requests.

Fixture trước đường mạng

Fixture trước đường mạng

BeautifulSoup proxy và parser kiểm tra từng bản ghi

Parser dưới đây chủ động từ chối đầu vào không đáp ứng hợp đồng đã định. Với công việc khác, anh em có thể chọn cách cách ly bản ghi lỗi thay vì dừng cả trang. Điều cần thống nhất trước là khi nào dữ liệu được chấp nhận, khi nào phải báo lỗi và ai xử lý những bản ghi bị loại.

Viết hàm phân tích độc lập

Lưu mã thành bs4_proxy.py. Hàm không biết mật khẩu, tuyến kết nối hay số lần retry; nó chỉ đọc tài liệu đã có. Sự độc lập này cho phép chạy kiểm thử bằng fixture nhanh chóng, đồng thời tránh việc mỗi lần sửa selector lại phát sinh thêm yêu cầu tới website.

from urllib.parse import urljoin, urlsplit
import requests
from bs4 import BeautifulSoup
 
 
def parse_records(content, page_url):
    soup = BeautifulSoup(content, 'html.parser')
    cards = soup.select('article[data-record]')
    if not cards:
        raise ValueError('NO_RECORDS')
    records, seen = [], set()
    for card in cards:
        record_id = (card.get('data-record') or '').strip()
        link = card.select_one('h2 a')
        author = card.select_one('.author')
        if not record_id or link is None:
            raise ValueError('MISSING_REQUIRED_FIELD')
        title = link.get_text(' ', strip=True)
        href = link.get('href')
        if not title or not href:
            raise ValueError('MISSING_REQUIRED_FIELD')
        detail_url = urljoin(page_url, href)
        if urlsplit(detail_url).scheme not in ('http', 'https'):
            raise ValueError('INVALID_LINK')
        if record_id in seen:
            raise ValueError('DUPLICATE_ID')
        seen.add(record_id)
        records.append({
            'id': record_id,
            'title': title,
            'author': author.get_text(' ', strip=True)
                if author else None,
            'url': detail_url,
        })
    return records

Selector được chạy bên trong từng card nên tác giả của bản đầu không thể bị gán sang bản sau. Thao tác get_text với dấu cách giữ khoảng phân cách giữa chữ thường và thẻ b trong tiêu đề. Nếu bỏ dấu cách, một số cấu trúc có thể tạo chuỗi dính chữ, ảnh hưởng tìm kiếm và so sánh dữ liệu về sau.

Xử lý URL sau khi trích thuộc tính

Hàm urljoin ghép href với URL trang để tạo đường dẫn có thể lưu vào kết quả. Tài liệu urllib.parse của Python mô tả cách ghép và tách các thành phần URL. Ví dụ còn kiểm tra scheme để không chấp nhận javascript hoặc các giao thức ngoài phạm vi dữ liệu bài viết.

Kiểm tra scheme chưa đồng nghĩa với giới hạn tên miền. Một href bắt đầu bằng địa chỉ HTTPS của tên miền khác vẫn được parser này chấp nhận và chỉ được lưu như dữ liệu. Nếu bước sau tự tải các URL đó, anh em phải bổ sung danh sách miền được phép, kiểm tra địa chỉ mạng và chính sách chuyển hướng tại chính tầng tải.

Xác định ý nghĩa danh sách rỗng

NO_RECORDS là quyết định của ví dụ, nhằm ngăn một trang sai nội dung bị ghi thành thành công với không bản ghi. Với trang danh sách thật sự có thể trống, cần một dấu hiệu riêng như thông báo không có bài viết. Khi thấy dấu hiệu hợp lệ ấy, ứng dụng mới trả danh sách rỗng theo hợp đồng đã thống nhất.

Không sửa parser thành chấp nhận mọi trang trống để làm biểu đồ lỗi đẹp hơn. Cách đó khiến sự cố selector, trang đăng nhập hoặc tài liệu JavaScript bị che thành dữ liệu hợp lệ. Hãy lưu loại lỗi cùng mã tác vụ, sau đó kiểm tra mẫu HTML đã được làm sạch trước khi thay đổi điều kiện.

BeautifulSoup proxy và tải HTTPS qua Requests

Sau khi parser vượt qua fixture, thêm hàm tải vào cùng tệp. Ví dụ chỉ nhận đích HTTPS và endpoint proxy dạng HTTP hoặc HTTPS. Đây là giới hạn chủ động của đoạn mã; nó không thể hiện mọi giao thức Requests hỗ trợ, cũng không phải tuyên bố tất cả nhà cung cấp dùng cùng một kiểu endpoint.

Tạo hàm tải có giới hạn

Tài liệu proxy của Requests giải thích ánh xạ theo scheme của URL đích. Trong ví dụ, cả khóa http và https nhận cùng endpoint, còn request thật được giới hạn ở HTTPS. Tên khóa https không buộc chuỗi endpoint phải bắt đầu bằng https.

def fetch_records(target, proxy_url, ca_bundle=True):
    if urlsplit(target).scheme != 'https':
        raise ValueError('HTTPS_TARGET_REQUIRED')
    if urlsplit(proxy_url).scheme not in ('http', 'https'):
        raise ValueError('HTTP_PROXY_REQUIRED')
    proxies = {'http': proxy_url, 'https': proxy_url}
    with requests.Session() as session:
        session.trust_env = False
        with session.get(
            target, proxies=proxies, timeout=(5, 15),
            allow_redirects=False, stream=True,
            verify=ca_bundle,
            headers={'Accept': 'text/html'},
        ) as response:
            response.raise_for_status()
            if response.status_code != 200:
                raise ValueError('UNEXPECTED_STATUS')
            if 'text/html' not in response.headers.get(
                'Content-Type', '').lower():
                raise ValueError('EXPECTED_HTML')
            body = bytearray()
            for chunk in response.iter_content(8192):
                body.extend(chunk)
                if len(body) > 2 * 1024 * 1024:
                    raise ValueError('BODY_TOO_LARGE')
            return parse_records(bytes(body), response.url)

Hàm chủ động đóng Session và Response sau khi dùng, kể cả khi parser báo lỗi. Phần body được giới hạn ở hai MiB theo lựa chọn của ví dụ, tránh tải không giới hạn một trang không đúng kỳ vọng. Nếu nguồn thật có tài liệu lớn hơn, cần đo kích thước rồi điều chỉnh hạn mức có lý do.

Truyền bí mật và đọc kết quả

Tạo tệp run_example.py với đoạn gọi sau. TARGET_URL phải là trang anh em có quyền kiểm thử và chứa cấu trúc fixture tương ứng. PROXY_URL lấy từ môi trường, không ghi cứng tài khoản thật vào bài hướng dẫn, kho Git hay ảnh chụp màn hình gửi cho người khác.

import json
import os
from bs4_proxy import fetch_records
 
rows = fetch_records(
    os.environ['TARGET_URL'],
    os.environ['PROXY_URL'],
)
with open('records.json', 'w', encoding='utf-8') as handle:
    json.dump(rows, handle, ensure_ascii=False, indent=2)
print('records:', len(rows))

Khi dùng username và password có ký tự đặc biệt, hãy tạo URL bằng quy tắc mã hóa phù hợp thay vì nối chuỗi tùy ý. Không in biến PROXY_URL khi kiểm tra sự tồn tại của biến. Thông báo cấu hình chỉ cần xác nhận biến đã có và ghi một mã endpoint nội bộ để người vận hành tra cứu.

Tách tải và phân tích

Tách tải và phân tích

BeautifulSoup proxy với kiểm thử parser trước mạng

Một bộ thử tốt cần kiểm tra cả kết quả đúng lẫn những đầu vào phải bị từ chối. Nếu chỉ kiểm tra chương trình không ném exception, parser vẫn có thể âm thầm ghép sai trường. Các assertion nên thể hiện hợp đồng dữ liệu, chẳng hạn tác giả thiếu phải là null và mã trùng phải được phát hiện.

Chạy kiểm tra dữ liệu mẫu

Đoạn kiểm tra ngắn dưới đây chạy trực tiếp trên records.html, không cần proxy. Hai assertion URL gắn với URL cơ sở giả lập nên dễ lặp lại trên máy khác. Khi đổi schema, hãy cập nhật fixture và assertion cùng lúc để ý nghĩa đầu ra được ghi rõ trong mã.

from pathlib import Path
from bs4_proxy import parse_records
 
rows = parse_records(
    Path('records.html').read_bytes(),
    'https://fixture.example/danh-sach',
)
assert len(rows) == 2
assert rows[0]['title'] == 'Kiểm tra kết nối'
assert rows[0]['author'] == 'Lê An'
assert rows[1]['author'] is None
assert rows[1]['url'] == 'https://fixture.example/bai-viet/du-lieu'
print('parser fixture: PASS')

Bộ kiểm thử đi kèm bản nháp đã chạy tám kiểm tra parser: số bản ghi, chữ lồng trong tiêu đề, tác giả thiếu, URL tương đối, vỏ trang JavaScript rỗng, thiếu liên kết, liên kết script và mã bị trùng. Kết quả này xác nhận hành vi của dữ liệu mẫu, không bao phủ mọi cấu trúc HTML ngoài thực tế.

Kiểm thử đường mạng riêng

Phép thử thứ chín dùng HTTPS fixture và HTTP CONNECT có xác thực trong môi trường localhost. Mục tiêu là kiểm tra hàm tải có thể nhận HTML qua tuyến trung gian rồi chuyển bytes cho parser. Bộ thử cục bộ không đo độ trễ, danh tiếng IP hoặc khả năng truy cập website thương mại của dịch vụ nào.

Khi chuyển sang endpoint thật, anh em cần chạy lại với URL kiểm thử được phép và ghi thời điểm, phiên bản, mã tuyến cùng kết quả. Nếu không có quyền kiểm thử nguồn đích, dừng ở fixture. Không biến một kết quả localhost thành lời cam kết rằng mọi website sẽ chấp nhận cùng cấu hình.

Lưu bằng chứng đủ dùng

Mỗi lần chạy nên lưu mã phiên bản chương trình, tên fixture và nhóm assertion đã vượt qua. Không cần lưu lại toàn bộ phản hồi ở mọi tác vụ thành công. Với lỗi nội dung, chỉ lấy mẫu đã loại thông tin cá nhân hoặc dữ liệu phiên; mục đích là tái hiện cấu trúc, không tạo thêm một kho dữ liệu nhạy cảm.

Bản ghi thử cần phân biệt failed với skipped. Một ca mạng chưa chạy vì thiếu endpoint phải mang trạng thái bỏ qua có lý do. Nếu gộp nó vào tổng số đạt, người nhận bàn giao sẽ hiểu nhầm phạm vi kiểm chứng và có thể đưa chương trình vào lịch chạy mà chưa kiểm tra tuyến thật.

BeautifulSoup proxy và phân loại lỗi có hành động

Thông báo lỗi chỉ hữu ích khi giúp chọn bước tiếp theo. Đừng gom mọi exception thành dòng proxy chết vì nhiều lỗi xảy ra sau khi kết nối đã thành công. Bảng dưới dùng các mã của ví dụ để phân biệt tình trạng cần sửa dữ liệu, cấu hình hoặc giới hạn tải.

Bảng: BeautifulSoup proxy và phân loại lỗi có hành động

Dấu hiệu

Nhóm cần kiểm tra

Hành động ban đầu

ProxyError hoặc lỗi CONNECT

Tuyến và xác thực

Kiểm tra endpoint đã che bí mật

Timeout

Kết nối hoặc đọc

Đối chiếu giai đoạn và thời điểm

UNEXPECTED_STATUS

Phản hồi HTTP

Xem status và chính sách redirect

EXPECTED_HTML

Loại nội dung

Đọc Content-Type, không parse JSON

NO_RECORDS

Nội dung và selector

So mẫu HTML với fixture

DUPLICATE_ID

Hợp đồng bản ghi

Kiểm tra mã và cấu trúc danh sách

Đọc timeout đúng phạm vi

Tham số timeout trong ví dụ tách ngưỡng kết nối và đọc, với các giá trị do bài chọn để minh họa. Phần timeout của Requests lưu ý đây không phải giới hạn tổng thời gian tải cả phản hồi. Một nguồn liên tục gửi dữ liệu có thể khiến tác vụ kéo dài hơn con số đọc đã đặt.

Nếu lịch chạy cần ngân sách thời gian cho toàn tác vụ, hãy quản lý deadline ở tầng điều phối bên ngoài. Khi deadline hết, đánh dấu công việc chưa hoàn thành và không ghi kết quả dở dang thành thành công. Việc tăng timeout liên tục mà không phân loại giai đoạn lỗi sẽ làm hàng đợi chậm nhưng không giúp hiểu nguyên nhân.

Giữ kiểm tra chứng chỉ

Mặc định ca_bundle=True giữ kiểm tra chứng chỉ của kết nối đích. Tham số ca_bundle có thể nhận đường dẫn bộ CA trong môi trường thử được quản lý. Không thay bằng False để bỏ lỗi TLS rồi kết luận đường tải đã sẵn sàng; cách đó làm mất một điều kiện xác minh đang cần được kiểm tra.

Khi xuất hiện lỗi chứng chỉ, hãy kiểm tra đồng hồ hệ thống, tên máy chủ và chuỗi CA theo môi trường. Nếu mạng tổ chức có thiết bị kiểm tra TLS, dùng quy trình cấp CA được đơn vị đó chấp thuận. Mọi thay đổi phải được ghi vào cấu hình triển khai, tránh để một ngoại lệ thử nghiệm lan sang tác vụ thật.

Lỗi có hành động

Lỗi có hành động

BeautifulSoup proxy với encoding và dữ liệu thiếu

Chất lượng đầu ra phải được đánh giá bằng trường dữ liệu cụ thể. Một danh sách đủ số dòng vẫn có thể chứa chữ lỗi, khoảng trắng lạ hoặc URL sai nguồn. Với fixture hiện tại, anh em có thể thêm assertion cho chuỗi tiếng Việt để phát hiện thay đổi giải mã khi nâng cấp thư viện.

Giữ bytes cho bước phân tích

Ví dụ chuyển bytes vào parser và khai báo UTF-8 trong tài liệu mẫu. Nếu đầu vào đã bị giải mã sai ở bước trước, parser không thể tự khôi phục mọi thông tin gốc. Trong quá trình chẩn đoán, hãy so bytes, khai báo charset và chuỗi kết quả trước khi thêm các phép thay thế ký tự.

Không xóa dấu tiếng Việt chỉ để làm phép so sánh vượt qua. Thay đổi như vậy làm mất dữ liệu mà chương trình cần thu thập. Nếu nguồn có nhiều cách viết hợp lệ, giữ một trường văn bản gốc và xây trường chuẩn hóa riêng phục vụ tìm kiếm; người nhận dữ liệu vẫn có thể truy lại nội dung được xuất bản.

Phân biệt không có và rỗng

Tác giả không tồn tại được biểu diễn bằng None, sau khi xuất JSON trở thành null. Một thẻ tác giả tồn tại nhưng không có chữ lại là chuỗi rỗng trong ví dụ. Nếu nghiệp vụ cần gộp hai trường hợp, hãy sửa quy tắc một cách có chủ đích và thêm fixture cho thẻ rỗng, đừng để sự gộp xảy ra ngẫu nhiên.

Tương tự, tiêu đề là trường bắt buộc nên không được thay bằng chuỗi mặc định như chưa rõ rồi cho đi tiếp. Giá trị thay thế có thể làm báo cáo trông đủ dữ liệu nhưng che một selector đã hỏng. Với tác vụ cần tiếp tục xử lý trang khác, hãy đưa bản ghi lỗi vào hàng đợi kiểm tra riêng thay vì làm giả tiêu đề.

Kiểm tra thay đổi cấu trúc

Một lần thay giao diện có thể giữ nguyên thẻ article nhưng đổi lớp tác giả hoặc vị trí liên kết. Khi đó, kiểm tra số card chưa đủ để phát hiện dữ liệu suy giảm. Anh em nên theo dõi tỷ lệ trường thiếu theo nguồn và thời điểm, rồi so với fixture đại diện trước khi chỉnh selector.

Không dùng một selector quá rộng để cứu nhanh mọi trường hợp. Lấy liên kết đầu tiên ở bất kỳ đâu trong card có thể chọn đường dẫn quảng cáo hoặc danh mục. Khi thêm phương án dự phòng, cần mô tả điều kiện chọn và ca thử chứng minh liên kết mới vẫn thuộc đúng bản ghi.

BeautifulSoup proxy khi đưa vào lịch thu thập

Đưa ví dụ vào vận hành cần thêm điều phối, nhưng không nên làm hàm parser gánh tất cả trách nhiệm. Hàng đợi quyết định thời điểm chạy; HTTP client xử lý tuyến; parser quyết định dữ liệu hợp lệ; nơi lưu trữ quyết định khi nào ghi kết quả. Ranh giới này giúp thay một thành phần mà ít ảnh hưởng phần còn lại.

Thiết lập nhịp và retry hữu hạn

Bắt đầu với một tác vụ nhỏ, chạy tuần tự và tuân thủ quyền sử dụng nguồn. Chỉ retry lỗi được xác định có thể phục hồi, với số lần và thời gian chờ hữu hạn. NO_RECORDS hoặc DUPLICATE_ID thường cần xem nội dung trước; lặp lại ngay cùng đầu vào có thể chỉ tăng tải mà không sửa được lỗi.

Với phản hồi giới hạn truy cập, dừng hoặc giảm nhịp theo chính sách nguồn thay vì tăng số tuyến để tiếp tục gửi. Ghi lại lần chạy đã bị trì hoãn để báo cáo không hiểu nhầm là dữ liệu không thay đổi. Nhịp thu thập phải dựa vào quyền và nhu cầu dữ liệu, không dựa vào khả năng tạo nhiều request.

Chọn tuyến theo tiêu chí kiểm tra

Trước khi mua proxy, anh em nên xác định giao thức endpoint, cách xác thực và phạm vi website được phép kiểm thử. Hãy thử một đường tải HTTPS cùng fixture trước khi chọn quy mô sử dụng. Một gói có nhiều địa chỉ không tự khắc phục selector sai hoặc tài liệu chỉ xuất hiện sau JavaScript.

Nếu công việc cần giữ phiên, hãy định nghĩa phiên theo tác vụ và vòng đời Session, đồng thời kiểm tra chính sách endpoint thực tế. Đừng đổi tuyến giữa các bước mà chưa biết cookie hoặc nội dung có phụ thuộc vị trí kết nối hay không. Mọi giả định về giữ phiên cần được xác nhận trong môi trường được phép thử.

Ghi kết quả theo lô đã kiểm tra

Nên tạo kết quả vào tệp tạm rồi chỉ công bố khi toàn lô vượt qua điều kiện dữ liệu. Nếu lỗi xuất hiện giữa trang thứ hai, việc giữ tệp cũ tốt hơn ghi đè bằng nửa danh sách mới mà không có cảnh báo. Kèm mã lô và thời điểm thu thập để hệ thống dùng dữ liệu nhận biết phiên bản.

Khi cần lưu một phần kết quả, hãy tách trạng thái partial khỏi success và ghi rõ trang nào đã xử lý. Đừng suy ra một URL không xuất hiện nghĩa là bài viết đã bị xóa khi lô thu thập còn thiếu trang. Quy tắc công bố dữ liệu có tác động trực tiếp tới các báo cáo dùng đầu ra của crawler.

Phân trang và khóa chống lặp

Khi thêm phân trang, hãy coi URL trang danh sách là một đầu vào riêng của hàm tải. Ghi các trang đã xử lý và đặt số trang tối đa cho mỗi tác vụ. Nếu trang kế tiếp trỏ ngược về trang hiện tại hoặc lặp lại một URL đã thấy, dừng với lỗi phân trang thay vì tiếp tục cho tới khi hết thời gian.

Mã bản ghi đang được kiểm tra trùng trong từng tài liệu, chưa kiểm tra giữa nhiều trang. Ở tầng điều phối, dùng một tập mã cho cả lô nếu mã có tính duy nhất trên nguồn. Nếu cùng mã xuất hiện với nội dung khác, lưu xung đột để kiểm tra; việc chọn bản đầu hay bản cuối phải dựa vào quy tắc cập nhật đã thống nhất.

Không lấy tổng số card của trang đầu làm tổng số dữ liệu nguồn. Một bộ lọc, phiên đăng nhập hoặc cách phân trang có thể ảnh hưởng số bản ghi được nhìn thấy. Báo cáo nên ghi số trang đã xử lý cùng điều kiện kết thúc, để người dùng phân biệt thu thập đủ theo kế hoạch với một lô dừng sớm.

Chạy lại mà không nhân đôi kết quả

Một tác vụ có thể bị ngắt sau khi đã ghi tệp nhưng trước khi đánh dấu hoàn tất. Nếu lần chạy lại chỉ nối thêm dữ liệu, kết quả dễ bị nhân đôi. Hãy dùng mã lô và khóa bản ghi khi ghi vào nơi lưu trữ, hoặc tạo lại tệp của cả lô rồi thay thế sau khi kiểm tra thành công.

Thời điểm thu thập và thời điểm xuất bản là hai trường khác ý nghĩa. Ví dụ không tự suy ra ngày đăng từ tên đường dẫn hay thứ tự card. Nếu nghiệp vụ cần trường ngày, hãy thêm selector cùng quy tắc múi giờ và fixture lỗi định dạng trước khi đưa trường ấy vào schema chính thức.

Một bản ghi được thu thập lại sau vài phút có thể giống nội dung nhưng khác thời điểm quan sát. Quyết định lưu lịch sử hay chỉ giữ trạng thái gần nhất phụ thuộc mục tiêu báo cáo. Viết rõ quyết định này trong bàn giao để parser không bị sửa tùy tiện chỉ vì người vận hành muốn thay cách lưu dữ liệu.

Bàn giao có bằng chứng

Bàn giao có bằng chứng

BeautifulSoup proxy và checklist bàn giao

Bàn giao cần giúp người tiếp theo tái hiện kết quả mà không hỏi lại những giả định ẩn. Gói tối thiểu gồm mã nguồn, fixture, phụ thuộc đã ghi phiên bản, cách cấp biến môi trường và báo cáo kiểm thử. Thông tin đăng nhập thuộc kênh quản lý bí mật riêng, không đặt trong cùng tệp hướng dẫn.

Điều kiện trước khi chạy nguồn thật

Anh em hãy xác nhận cấu trúc HTML nguồn bằng một mẫu được phép lưu, thống nhất trường bắt buộc và quy tắc danh sách trống. Sau đó chạy parser bằng mẫu ấy trước khi thử đường mạng. Nếu có thay đổi khác fixture bài này, thêm kiểm tra tương ứng thay vì giả định ví dụ đã bao phủ.

Trước khi tăng quy mô, cần xác nhận lỗi được ghi theo nhóm, lô thất bại không làm mất kết quả tốt và deadline của lịch chạy có hiệu lực. Người nhận bàn giao cũng cần biết phép thử nào chỉ chạy localhost. Những giới hạn được ghi rõ giúp họ xác định công việc cần kiểm tra tiếp theo.

BeautifulSoup proxy hữu ích khi tuyến tải, parser và dữ liệu đầu ra được kiểm tra riêng. Anh em hãy bắt đầu bằng fixture, giữ bằng chứng kiểm thử và chỉ mở rộng sau khi xác nhận nguồn thật. 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ấu hình phù hợp cho BeautifulSoup proxy.

TIN TỨC LIÊN QUAN