Bị chặn CAPTCHA ở trang 47: Bài học đắt giá khi cào dữ liệu web

06 tháng 4, 2026·2 phút đọc

Tác giả từng tự tin với thiết lập cào dữ liệu (scraping) của mình, nhưng lại liên tục bị chặn bởi CAPTCHA ngay từ trang thứ 47. Dù đã thử thay đổi độ trễ và sử dụng nhiều nhà cung cấp proxy khác nhau, giải pháp cuối cùng vẫn là sử dụng dịch vụ giải mã CAPTCHA trả phí. Bài viết chia sẻ kinh nghiệm thực tế và góc nhìn về việc tôn trọng cơ chế bảo mật của website.

Bị chặn CAPTCHA ở trang 47: Bài học đắt giá khi cào dữ liệu web

Tôi từng nghĩ mình khá thông minh với thiết lập cào dữ liệu (web scraping) của mình. Tốc độ 10 yêu cầu mỗi phút, xoay vòng User-Agent, và sử dụng residential proxy. Nhưng đến trang 47, CAPTCHA xuất hiện. Trang 48, CAPTCHA. Trang 49, CAPTCHA. Thật là những lúc "vui vẻ".

Website đó đã quyết định rằng tôi là một bot ngay khi tôi chạm đến một ngưỡng nào đó. Việc tôi đi chậm hay giả lập giống trình duyệt thật đều không quan trọng. Bức tường CAPTCHA xuất hiện như một định mệnh, bắt đầu từ trang 47.

Điều đầu tiên tôi thử là tăng độ trễ. 30 giây giữa các yêu cầu. Vẫn bị chặn ở trang 47. Thật thú vị.

Sau đó, tôi thử các nhà cung cấp proxy khác nhau. Ba nhà cung cấp. Kết quả vẫn y hệt, cùng một số trang. Lúc này, tôi tin rằng ngưỡng giới hạn liên quan đến địa chỉ IP của mình, nhưng không, điều tương tự cũng xảy ra với các IP mới tinh.

Hóa ra là website đó thực sự, thực sự rất ghét việc bị cào dữ liệu tự động. Và tôi quá cứng đầu để bỏ cuộc.

Cuối cùng, tôi đành "cắn răng" trả tiền cho dịch vụ 2captcha. Nếu bạn chưa biết, họ giải quyết CAPTCHA bằng người thật (hoặc các mô hình rất tốt, điều này không rõ ràng). Việc tích hợp trông như sau:

import time
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('YOUR_API_KEY')

def scrape_with_captcha_handling(url):
    response = requests.get(url, headers=headers)

    if 'captcha' in response.text:
        # Tìm hình ảnh/sitekey của CAPTCHA
        captcha_element = response.text.find('data-sitekey')
        sitekey = extract_between(response.text, 'data-sitekey="', '"')

        # Gửi tới 2captcha
        result = solver.turnstile(sitekey=sitekey, url=url)

        # Thử lại với token
        response = requests.post(
            url + '/verify',
            data={'captcha_token': result['code']}
        )

    return parse_page(response)

Không hề tinh tế chút nào. Nhưng nó hoạt động.

Sự thật mà không ai muốn nghe: nếu một website ném CAPTCHA vào mặt bạn, có lẽ bạn không nên cào nó nữa. Tôi biết, tôi biết, điều này không giúp ích gì. Nhưng thành thật mà nói? Nếu một website quyết liệt chặn bot đến thế, thường là có lý do. Hoặc họ đang bảo vệ thứ gì đó giá trị, hoặc họ lo ngại về trách nhiệm pháp lý, hoặc cả hai.

Tuy nhiên, nếu bạn thực sự cần dữ liệu và website không cung cấp API, 2captcha là giải pháp cuối cùng. Tốn tiền, tăng độ trễ (latency), nhưng bạn sẽ lấy được dữ liệu.

Trong trường hợp của tôi, nó vẫn đáng giá.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗