🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

curl_cffi Web Scraping: Dấu vân tay TLS của trình duyệt trong Python

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

22-Jul-2026

Tóm tắt:

  • curl_cffi là một khách hàng HTTP Python giả vờ như một cú bắt tay TLS của trình duyệt thực, do đó một máy chủ xác định dấu vân tay kết nối sẽ thấy Chrome thay vì một khách hàng kịch bản.
  • Một lệnh requests.get(url, impersonate="chrome") cung cấp một dấu vân tay JA3 của trình duyệt và thương lượng HTTP/2, không cần quy trình trình duyệt.
  • Băm JA3 thay đổi mỗi lần chạy, và điều đó là đúng: GREASE chèn các giá trị ngẫu nhiên vào cú bắt tay, mà Chrome thực cũng làm như vậy.
  • curl_cffi không chạy JavaScript, vì vậy trên một trang được kết xuất bởi khách hàng, nó trả về một shell trống; hướng dẫn chứng minh điều đó với 0 khối trích dẫn từ curl_cffi và 10 từ Scrapeless với việc kết xuất.
  • Sử dụng curl_cffi khi dấu vân tay TLS là rào cản, và cho Scrapeless khi trang cần kết xuất, thách thức đã được giải quyết hoặc xoay vòng IP.
  • Bắt đầu với gói miễn phí Scrapeless cho các trang mà sự giả mạo TLS không thể tiếp cận.

Một khách hàng HTTP Python thông thường có một điểm yếu mà mục tiêu có thể đọc trước khi nó gửi một byte HTML: cú bắt tay TLS của nó. Tập hợp các thuật toán mã hóa và các mở rộng trong ClientHello không giống như của một trình duyệt, và một máy chủ xác định dấu vân tay đó có thể chặn yêu cầu chỉ dựa vào dấu vân tay. curl_cffi đóng khoảng trống đó bằng cách mượn chữ ký TLS của một trình duyệt thực.

Hướng dẫn này cho thấy curl_cffi cung cấp một dấu vân tay của trình duyệt, giải thích tại sao băm JA3 không cố định, và sau đó vẽ ra ranh giới mà curl_cffi không thể vượt qua. Nơi nào một trang yêu cầu một trình duyệt thực, API Thu thập Dữ liệu Toàn cầu Scrapeless sẽ đảm nhận. Mỗi con số dưới đây đến từ một lần chạy thực tế.

Những gì curl_cffi làm

curl_cffi là một khách hàng HTTP kiểu requests được xây dựng trên curl-impersonate, và nhiệm vụ của nó là làm cho cú bắt tay TLS trông giống như của một trình duyệt cụ thể. Một máy chủ kiểm tra cú bắt tay sẽ tính toán một dấu vân tay JA3, một tóm tắt phiên bản ClientHello, các thuật toán mã hóa và các mở rộng được định nghĩa qua cú bắt tay TLS 1.3. Một khách hàng Python mặc định tạo ra một dấu vân tay mà không trình duyệt nào có; curl_cffi tạo ra một dấu vân tay của một trình duyệt được nêu tên. Kho lưu trữ curl_cffi liệt kê các phiên bản trình duyệt mà nó có thể giả mạo.

Điều mà curl_cffi không làm là chạy một trình duyệt. Không có động cơ JavaScript, không có kết xuất và không giải quyết thách thức. Nó là một dấu vân tay, không phải một trình duyệt.

Cài đặt

curl_cffi là một cài đặt pip đơn giản.

bash Copy
pip install curl_cffi

Giả mạo Dấu vân tay của một Trình duyệt

Truyền impersonate với tên trình duyệt và curl_cffi sẽ xây dựng cú bắt tay TLS của trình duyệt đó. Yêu cầu dưới đây yêu cầu một dịch vụ xác định dấu vân tay báo cáo những gì nó thấy.

python Copy
from curl_cffi import requests

response = requests.get("https://tls.peet.ws/api/all", impersonate="chrome", timeout=30)
fingerprint = response.json()
print("phiên bản http:", fingerprint["http_version"])
print("băm ja3:", fingerprint["tls"]["ja3_hash"])

Dịch vụ báo cáo HTTP/2, điều mà một trình duyệt thương lượng và một khách hàng mặc định thường không làm, và một băm JA3.

text Copy
phiên bản http: h2
băm ja3: 9a23d5cedcea13483954537602158034

Giá trị băm ja3 ở trên là kết quả của một lần chạy; chạy lại chương trình và nó thay đổi. Điều đó không phải là lỗi. Cơ chế GREASE chèn các giá trị phân quyền ngẫu nhiên vào ClientHello, và Chrome thực cũng làm như vậy, vì vậy băm JA3 khác nhau từ kết nối này sang kết nối khác. Những gì vẫn giống như một trình duyệt là hình dạng của cú bắt tay, mà đó là những gì một kiểm tra dấu vân tay thực sự đánh giá.

Nơi curl_cffi dừng lại

Một dấu vân tay TLS của trình duyệt giúp yêu cầu vượt qua một kiểm tra cú bắt tay, nhưng nó không kết xuất trang. Trên một trang mà xây dựng nội dung của nó bằng JavaScript, curl_cffi trả về chính xác những gì máy chủ gửi, đó là một shell trống, và không có bất kỳ mức độ giả mạo TLS nào lấp đầy nó. Đây là nơi cần có một công cụ kết xuất.

Đặt khóa Scrapeless của bạn trong shell. Sử dụng khóa thực tại thời gian chạy và giữ chỗ cho nó ra khỏi mã nguồn của bạn.

bash Copy
export SCRAPELESS_API_KEY="sk_your_key_here"

Chương trình dưới đây lấy một trang trích dẫn được kết xuất bằng JavaScript theo hai cách: curl_cffi với một dấu vân tay Chrome hoàn hảo, và Scrapeless với việc kết xuất được bật.

python Copy
import json
import os
import urllib.request

from curl_cffi import requests

JS_PAGE = "https://quotes.toscrape.com/js/"

response = requests.get(JS_PAGE, impersonate="chrome", timeout=30)
print("trạng thái curl_cffi:", response.status_code)
print("các khối trích dẫn curl_cffi:", response.text.count('class="quote"'))


def scrapeless(url: str) -> str:
    payload = json.dumps(
```text
{"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": True, "headless": True}}
    ).encode()
    request = urllib.request.Request(
        "https://api.scrapeless.com/api/v2/unlocker/request",
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=90) as response:
        return json.loads(response.read())["data"]


html = scrapeless(JS_PAGE)
print("số lượng khối trích dẫn scrapeless:", html.count('class="quote"'))

curl_cffi nhận được 200 sạch và không có trích dẫn nào, bởi vì các trích dẫn được tạo bởi JavaScript không bao giờ chạy. Scrapeless kết xuất trang và các trích dẫn xuất hiện.

text Copy
tình trạng curl_cffi: 200
số khối trích dẫn curl_cffi: 0
số khối trích dẫn scrapeless: 10

Số 200 là cái bẫy: yêu cầu thành công, vì vậy không có gì trông có vẻ sai sót, nhưng nội dung không có ở đó. Hai công cụ trả lời hai vấn đề khác nhau. curl_cffi vượt qua kiểm tra dấu vân tay TLS; nó không kết xuất, xóa thử thách hoặc thay đổi IP. Đối với khái niệm đằng sau dấu vân tay, hướng dẫn về cách vượt qua kiểm tra dấu vân tay TLS đề cập đến những gì một máy chủ đo lường và tại sao.

Trước khi chạy bất kỳ điều gì qua một trang web, hãy đọc robots.txt và điều khoản của nó. Giao thức loại trừ Robot nêu rõ các đường dẫn mà một trang web yêu cầu các khách hàng tự động tránh, và tôn trọng điều này giữ cho một trình cào là bền vững.

Bạn đã sẵn sàng cho các trang mà chỉ dấu vân tay không thể tiếp cận? Tạo một tài khoản Scrapeless miễn phí và kết xuất chúng.

Kết luận

curl_cffi là công cụ đúng cho một nhiệm vụ: làm cho TLS handshake của một yêu cầu Python trông giống như của trình duyệt, điều này xóa một kiểm tra dấu vân tay mà không cần quy trình trình duyệt. Nó chính xác, và giới hạn của nó cũng chính xác, vì nó không chạy JavaScript và trả về lớp HTML trống rỗng của một trang được trình duyệt kết xuất. Sử dụng nó ở nơi mà bức tường là handshake, và chuyển trang cho Scrapeless khi cần thiết kết xuất, xóa thử thách hoặc IP mới. Bắt đầu từ các kịch bản ở trên và phù hợp công cụ với bức tường trước mặt bạn.

Bắt đầu với kế hoạch miễn phí Scrapeless cho các trang được kết xuất, và kiểm tra giá cả Scrapeless khi bạn cấp kích thước cho một công việc định kỳ.

Câu hỏi thường gặp

H: curl_cffi thực sự giả mạo cái gì?

curl_cffi giả mạo TLS handshake của một trình duyệt và các cài đặt HTTP/2 của nó, vì vậy ClientHello mà một máy chủ thấy khớp với một phiên bản trình duyệt đã đặt tên thay vì một khách hàng Python mặc định. Nó không giả mạo động cơ JavaScript hoặc rendering của trình duyệt, chỉ là dấu vân tay ở cấp mạng.

H: Tại sao hash JA3 thay đổi mỗi khi tôi chạy yêu cầu?

Bởi vì GREASE, điều này chèn các giá trị dự kiến ngẫu nhiên vào TLS ClientHello. Chrome thật cũng làm điều này, vì vậy hash JA3 thay đổi giữa các kết nối trong khi hình dạng có ý nghĩa của handshake vẫn giống như trình duyệt. Một hash thay đổi là điều mong đợi, không phải là dấu hiệu rằng việc giả mạo đã thất bại.

H: Có thể curl_cffi cào một trang được kết xuất bằng JavaScript không?

Không. curl_cffi không có động cơ JavaScript, vì vậy trên một trang được trình duyệt kết xuất nó trả về lớp HTML ban đầu với trạng thái 200 và không có nội dung nào của trang được kết xuất. Sử dụng một công cụ kết xuất như Scrapeless cho những trang đó, và giữ curl_cffi cho các điểm cuối có nội dung đã có sẵn trong phản hồi.

H: curl_cffi khác gì so với requests?

Thư viện requests gửi một TLS handshake Python chuẩn mà một máy chủ kiểm tra dấu vân tay có thể đánh dấu, trong khi curl_cffi gửi một handshake của trình duyệt thông qua tham số impersonate. API thì quen thuộc, vì vậy requests.get(url, impersonate="chrome") gần như là một sự thay thế cho mã đang bị chặn do dấu vân tay của nó.

H: Một dấu vân tay TLS của trình duyệt có đủ để tránh bị chặn không?

Nó đủ cho một kiểm tra dấu vân tay TLS và không còn gì nữa. Các trang thử thách, phân tích hành vi và danh tiếng IP là những mức bảo vệ riêng biệt mà curl_cffi không chạm vào, vì vậy khi những điều đó xảy ra, bạn cần kết xuất, xử lý thử thách hoặc xoay IP ngoài dấu vân tay.

Copy

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục