
Anh Tuan
Data Science Expert

CAPTCHA là một trong những thách thức lớn nhất trong web scraping và tự động hoá. Trong khi chúng đóng vai trò như một cơ chế phòng thủ để phân biệt người dùng thực với bot, chúng cũng gây ra những trở ngại đáng kể cho các nhà phát triển làm việc với các tác vụ tự động hoá hợp pháp. Hiểu cách thức hoạt động của CAPTCHA và các chiến lược tốt nhất để giải quyết chúng là rất quan trọng để xây dựng các scraper mạnh mẽ.
Một CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) là một cơ chế bảo mật được thiết kế để phân biệt giữa người dùng thực và bot tự động. Các trang web sử dụng CAPTCHA để bảo vệ chống lại thư rác, tấn công brute-force và scraping dữ liệu tự động. Ý tưởng đằng sau CAPTCHA là một số tác vụ, chẳng hạn như nhận dạng văn bản bị biến dạng hoặc nhận dạng các đối tượng trong hình ảnh, rất dễ dàng đối với con người nhưng khó khăn đối với máy móc.
Các trang web triển khai CAPTCHA vì một số lý do chính:
CAPTCHA hoạt động bằng cách đưa ra một thử thách đòi hỏi khả năng nhận thức hoặc kỹ năng nhận dạng hình ảnh mà con người tự nhiên sở hữu nhưng rất khó để bot sao chép. Quá trình xác minh thường tuân theo các bước sau:
Với những tiến bộ trong AI, một số CAPTCHA, chẳng hạn như Google’s reCAPTCHA v3 và Cloudflare Turnstile, không yêu cầu tương tác người dùng trực quan. Thay vào đó, chúng phân tích hành vi duyệt web và gán một điểm số rủi ro, cho phép hầu hết người dùng hợp pháp vượt qua mà không cần giải quyết một thử thách.
Mặc dù CAPTCHA khóa bot một cách hiệu quả, nhưng nó cũng gây ra những thách thức cho các scraper web hợp pháp, nhà nghiên cứu và nhà phát triển tự động hoá. Đó là lý do tại sao nhiều người trong ngành tìm kiếm các giải pháp giải quyết CAPTCHA để giải quyết những hạn chế này một cách hiệu quả trong khi vẫn tuân thủ các hướng dẫn bảo mật.
Các trang web sử dụng nhiều loại CAPTCHA khác nhau để bảo vệ chống lại bot, mỗi loại được thiết kế với các thử thách khác nhau:
Người dùng phải giải mã các chữ cái hoặc số bị biến dạng. Loại này đã được sử dụng rộng rãi nhưng dễ bị tổn thương trước công nghệ OCR tiên tiến.
Người dùng được yêu cầu chọn các đối tượng cụ thể, như đèn giao thông hoặc xe buýt, từ một lưới hình ảnh. Bot gặp khó khăn trong việc nhận dạng hình ảnh, mặc dù nó đang được cải thiện.
Người dùng phải di chuyển một mảnh ghép vào đúng vị trí. Điều này kiểm tra khả năng kiểm soát vận động tinh tế, khiến bot khó bắt chước.
Được thiết kế cho người dùng khiếm thị, các CAPTCHA này cung cấp lời nói bị biến dạng phải được gõ ra. Chúng rất hữu ích cho khả năng tiếp cận nhưng có thể khó hiểu.
Các CAPTCHA này theo dõi các hành động của người dùng như cử động chuột hoặc tốc độ gõ để xác định xem người dùng có phải là người hay không. Bot không thể dễ dàng sao chép các mô hình này.
Chúng đánh giá hành vi của người dùng và gán một điểm số rủi ro. Nếu điểm số cao, người dùng có thể không thấy thử thách, nhưng nếu điểm số thấp, có thể yêu cầu xác minh bổ sung.
Mỗi loại đều đặt ra những thách thức riêng cho việc scraping web, đòi hỏi các kỹ thuật khác nhau để giải quyết.
Mặc dù việc xây dựng một trình giải CAPTCHA nội bộ là có thể, nhưng nó đòi hỏi thời gian, tài nguyên và sức mạnh tính toán đáng kể. Một giải pháp thay thế là sử dụng các dịch vụ giải quyết CAPTCHA của bên thứ ba sử dụng AI và người lao động để cung cấp các giải pháp nhanh chóng.
Các dịch vụ như CapSolver cung cấp các giải pháp dựa trên API tích hợp liền mạch với các script scraping web. Các dịch vụ này xử lý reCAPTCHA và CAPTCHA hình ảnh, giảm độ phức tạp của việc giải quyết CAPTCHA thủ công.
Nhận mã khuyến mãi của bạn để có giải pháp captcha hàng đầu; CapSolver: CAPT. Sau khi đổi, bạn sẽ nhận được thêm 5% tiền thưởng sau mỗi lần nạp tiền, không giới hạn
Dưới đây là một ví dụ về cách tích hợp trình giải dựa trên API vào script Selenium:
import requests
def solve_captcha(api_key, site_key, url):
response = requests.post("https://api.capsolver.com/solve", json={
"apiKey": api_key,
"siteKey": site_key,
"url": url
})
return response.json().get("code")
captcha_token = solve_captcha("YOUR_API_KEY", "SITE_KEY", "https://example.com")
print("Captcha Solved Token:", captcha_token)
Các phương pháp dựa trên OCR liên quan đến việc sử dụng các kỹ thuật xử lý ảnh để trích xuất văn bản từ CAPTCHA. Các thư viện phổ biến như Tesseract OCR có thể được sử dụng, nhưng chúng thường đòi hỏi đào tạo rộng rãi để xử lý sự biến dạng và nhiễu.
import pytesseract
from PIL import Image
image = Image.open("captcha_image.png")
text = pytesseract.image_to_string(image)
print("Extracted Captcha Text:", text)
Mặc dù OCR có thể hoạt động đối với các CAPTCHA đơn giản, nhưng các CAPTCHA hiện đại sử dụng nhiễu, che khuất và các kỹ thuật đối kháng làm cho OCR trở nên không hiệu quả.
Đối với CAPTCHA yêu cầu nhận dạng hình ảnh, các mô hình học sâu được đào tạo trên các tập dữ liệu có nhãn có thể hữu ích. TensorFlow và PyTorch có thể được sử dụng để xây dựng các mô hình CNN có khả năng nhận dạng các mẫu trong CAPTCHA.
Tuy nhiên, việc huấn luyện một mô hình hiệu quả đòi hỏi một tập dữ liệu lớn các CAPTCHA có nhãn, điều này có thể không thực tế đối với người dùng cá nhân.
CAPTCHA thanh trượt dựa trên việc phát hiện các khoảng trống trong hình ảnh nền. OpenCV có thể giúp xác định các khoảng trống này và tự động hoá thao tác thanh trượt.
import cv2
import numpy as np
def find_gap(image_path):
image = cv2.imread(image_path, 0)
edges = cv2.Canny(image, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
if w > 30: # Assuming a significant gap
return x
return None
Sau khi phát hiện khoảng trống, Selenium hoặc Playwright có thể được sử dụng để tự động hoá hành động kéo.
Một số CAPTCHA phân tích hành vi của người dùng, chẳng hạn như cử động chuột và gõ phím. Để giải quyết những vấn đề này, các script tự động phải bắt chước hành vi của con người bằng cách đưa yếu tố ngẫu nhiên vào các hành động.
from selenium.webdriver.common.action_chains import ActionChains
import random, time
def human_like_drag(driver, element, target_x):
action = ActionChains(driver)
action.click_and_hold(element)
current_x = 0
while current_x < target_x:
move_by = random.randint(1, 5)
action.move_by_offset(move_by, 0)
time.sleep(random.uniform(0.02, 0.1))
current_x += move_by
action.release().perform()
Giải quyết CAPTCHA là một nhiệm vụ phức tạp đòi hỏi các phương pháp khác nhau tùy thuộc vào loại CAPTCHA. Mặc dù OCR và học máy có thể giúp ích, nhưng chúng thường bị hạn chế bởi các kỹ thuật che khuất CAPTCHA. Tương tác giống như con người có thể hoạt động đối với các thử thách dựa trên hành vi, nhưng rất khó để duy trì ở quy mô lớn.
Đối với hầu hết các tác vụ scraping web, việc sử dụng dịch vụ giải quyết CAPTCHA đáng tin cậy có thể là lựa chọn hiệu quả nhất. Các giải pháp như CapSolver cung cấp một API dễ dàng tích hợp giúp tự động hoá việc xử lý CAPTCHA, cho phép các nhà phát triển tập trung vào việc trích xuất dữ liệu hơn là giải quyết CAPTCHA.
Hãy học cách xác định nguyên nhân gây ra lỗi Cloudflare 1020 Truy cập Bị Từ Chối, cách Tường lửa Ứng dụng Web và phát hiện bot hoạt động, và cách các nhà phát triển giảm thiểu kết quả dương tính giả trong các quy trình tự động hợp lệ.

Học cách sử dụng mẫu CapSolver n8n để theo dõi các trang sản phẩm được bảo vệ bởi AWS WAF, giải quyết các thách thức, trích xuất giá cả, so sánh các thay đổi và kích hoạt cảnh báo tự động.
