Browser fingerprinting được giải thích cho scraper
Browser fingerprinting là cách nhận diện khách truy cập dựa trên tổng hợp các đặc điểm của trình duyệt, chứ không dựa vào cookie hay tài khoản. Website dùng nó để nhận ra khách quay lại, phát hiện gian lận và nhận diện tự động hóa. Nếu bạn scrape web, bạn sẽ gặp nó. Hướng dẫn này giải thích những gì được đo, vì sao chỉ một chỗ không khớp cũng gây rắc rối, và cách giữ một hồ sơ trình duyệt nhất quán, cư xử đúng mực để thu thập dữ liệu công khai. Nó cũng giải thích giới hạn của việc tinh chỉnh fingerprint nên đến đâu.
Một fingerprint được tạo từ những gì
Không có giá trị đơn lẻ nào tự nhận diện được một trình duyệt, nhưng nhiều giá trị nhỏ ghép lại thường làm được điều đó. Các đầu vào phổ biến gồm:
- User agent và client hints. Tên trình duyệt, phiên bản và hệ điều hành mà trình duyệt tự khai báo.
- Kích thước màn hình và cửa sổ. Kích thước màn hình, độ sâu màu, tỉ lệ điểm ảnh của thiết bị và kích thước viewport.
- Ngôn ngữ và múi giờ. Header
Accept-Language,navigator.languagesvà múi giờ mà trình duyệt báo cáo. - Phông chữ đã cài. Các phông chữ mà trang có thể phát hiện, khác nhau giữa các hệ điều hành và phần mềm đã cài.
- Kết quả canvas, WebGL và âm thanh. Những khác biệt nhỏ trong cách ngăn xếp đồ họa hoặc âm thanh vẽ hay xử lý một hình ảnh hay âm thanh kiểm tra.
- Đặc điểm ở tầng mạng. Bắt tay TLS, cài đặt HTTP/2 và thứ tự các header yêu cầu. Máy chủ nhìn thấy những thứ này ngay cả trước khi JavaScript chạy.
Các script fingerprint gộp chúng thành một hash hoặc một điểm số. Càng nhiều tín hiệu ổn định và bất thường, kết quả càng dễ nhận diện.
Vì sao một chỗ không khớp dễ lộ
Một trình duyệt thật luôn nhất quán về nội bộ. Hệ điều hành khớp với phông chữ, múi giờ khớp với cài đặt ngôn ngữ, và kích thước màn hình khớp với thiết bị đang chạy nó. Scraper thường phá vỡ sự nhất quán đó mà không cố ý:
- Một user agent sao chép từ trình duyệt desktop, nhưng được gửi từ một máy chủ không có phông chữ nào được cài.
- Header
Accept-Languagetiếng Đức trên một yêu cầu có IP ở nước khác, với múi giờ không khớp với cả hai. - Một môi trường headless báo cáo kích thước cửa sổ mà không màn hình thật nào dùng.
- Một hồ sơ hoàn toàn mới ở mỗi lần chạy, nên cookie và lịch sử không bao giờ giống một khách quay lại.
Mỗi chỗ không khớp là một tín hiệu nhỏ. Gộp lại, chúng có thể đưa một yêu cầu từ "khách truy cập bình thường" sang "cần xem xét kỹ hơn".
Bước 1: đo thiết lập của chính bạn
Bạn có thể xem trang biết gì về client của mình bằng cách tải một trang kiểm tra fingerprint mà bạn kiểm soát, hoặc một trang chẩn đoán chạy cục bộ. Hãy nhìn các giá trị và tự hỏi liệu chúng có mô tả một máy tính nhất quán hay không. Đây là một ví dụ Playwright tối thiểu in ra vài giá trị trong số đó:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(locale="en-GB", timezone_id="Europe/London")
page = context.new_page()
page.goto("https://example.com") # thay bằng một trang bạn sở hữu
print(page.evaluate("""() => ({
language: navigator.language,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
platform: navigator.platform,
viewport: [innerWidth, innerHeight]
})"""))
browser.close()
Bước 2: mỗi hồ sơ chỉ giữ một danh tính
Thói quen hữu ích nhất là coi mỗi danh tính scraping là một hồ sơ. Gán cho nó một bộ đặc điểm duy nhất và giữ chúng trong suốt vòng đời của nó:
- Một bản trình duyệt, một user agent và một hệ điều hành.
- Locale, ngôn ngữ và múi giờ khớp với khu vực mà lưu lượng đến từ đó.
- Viewport và tỉ lệ điểm ảnh khớp với một màn hình thật.
- Một kho cookie bền vững, để hồ sơ hành xử như một khách quay lại.
Thay đổi một trong các yếu tố này cho mỗi yêu cầu đáng ngờ hơn là giữ chúng ổn định. Sự nhất quán là thứ khiến một hồ sơ trông bình thường.
Bước 3: điều tiết hồ sơ như một khách truy cập
Fingerprint chỉ là một đầu vào. Website cũng theo dõi tốc độ một hồ sơ di chuyển qua trang. Một hồ sơ tải hai trăm trang sản phẩm trong một phút không phải là người, bất kể fingerprint của nó ra sao. Hãy trải đều yêu cầu, lưu cache kết quả, và dừng lại khi một trang báo hiệu bạn nên làm vậy. Checklist scrape mà không bị chặn trình bày kỹ hơn về việc điều tiết tốc độ.
Bước 4: biết giới hạn
Việc tinh chỉnh fingerprint không thể khiến một bản tự động hóa trông như một người không có mặt ở đó. Các website dựa vào fingerprint thường kết hợp nó với giới hạn tần suất, kiểm tra tài khoản và đôi khi là captcha. Khi captcha xuất hiện, bạn cần một token từ bộ giải chứ không phải thêm nhiều chỉnh sửa fingerprint. Loại captcha đang chạy tại Scarnox là PopularCaptcha; hướng dẫn Python cho PopularCaptcha trình bày yêu cầu. Để có bức tranh rộng hơn về các widget hiện có, hãy đọc các loại captcha được giải thích.
Quan trọng hơn, việc né fingerprint không phải là giấy phép để phớt lờ quy định của website. Nếu chủ website đã hạn chế truy cập tự động, việc đúng đắn là dừng lại, chứ không phải làm hồ sơ của bạn khó bị nhận ra hơn. Fingerprinting cũng là một vấn đề về quyền riêng tư. Một số website dùng nó để theo dõi người dùng qua nhiều lần truy cập, và đó là một lý do nữa để chỉ thu thập những gì dự án của bạn cần.
Thu thập dữ liệu có trách nhiệm
- Đọc
robots.txtvà điều khoản trước khi scrape một website. - Dùng ít yêu cầu hơn, chậm hơn, và lưu cache những gì bạn đã thu thập.
- Không xây dựng hồ sơ để mạo danh người thật hoặc để vượt qua một khối chặn.
- Không lưu dữ liệu cá nhân mà bạn không cần, và xử lý cẩn thận những gì bạn lưu.
Nên đi tiếp đâu
Nếu mục tiêu của bạn nằm sau một kiểm tra ở mức trình duyệt, hãy bắt đầu với phát hiện trình duyệt headless, trình bày các tín hiệu đặc thù của trình duyệt tự động. Các trang cần JavaScript để hiển thị nội dung được trình bày trong scraping website dùng JavaScript.
Bắt đầu với tín dụng dùng thử miễn phí, không cần thẻ: tạo tài khoản và thử luồng PopularCaptcha trên một trang bạn sở hữu. Để biết giá hiện tại, xem trang bảng giá.