Chống block khi scraping dữ liệu với Python, VPS và Rotating Proxy (2025)

Tác giả: Tran Thao 30 tháng 08, 2025

Đối với các lập trình viên và chuyên gia dữ liệu, việc chống block khi scraping là một trong những thách thức kỹ thuật lớn và tốn thời gian nhất. Bạn cẩn thận xây dựng một scraper hoàn hảo, nhưng chỉ sau vài trăm request, nó đột ngột dừng lại.

Các thông báo lỗi quen thuộc như 403 Forbidden, 429 Too Many Requests, hay tệ hơn là trang CAPTCHA hiện ra. Đây chính là dấu hiệu cho thấy website mục tiêu đã phát hiện và chặn “con bot” của bạn. Cảm giác công sức đổ sông đổ bể thật sự khó chịu.

Nhưng đừng lo lắng, mọi rào cản đều có thể vượt qua nếu bạn có đúng công cụ và chiến lược. Bài viết này sẽ là kim chỉ nam toàn diện, hướng dẫn bạn kết hợp sức mạnh của Python, sự ổn định của VPS và khả năng “tàng hình” của Rotating Proxy.

Chúng tôi sẽ cung cấp kiến thức nền tảng, các kỹ thuật nâng cao và code mẫu thực tế để bạn có thể xây dựng những scraper mạnh mẽ, bền bỉ và gần như không thể bị phát hiện.

TL;DR – Giải pháp chống block hiệu quả nhất: Để chống block khi scraping năm 2025, hãy kết hợp 3 yếu tố:

  1. (1) Chạy code Python trên VPS để có môi trường ổn định,
  2. (2) Sử dụng dịch vụ Rotating Residential Proxy để liên tục thay đổi IP,
  3. (3) Giả lập hành vi người dùng thật bằng cách xoay vòng User-Agent, Headers và thêm độ trễ ngẫu nhiên.

Tại sao tôi bị chặn khi scraping? 5 lý do phổ biến nhất

Để chiến thắng, trước hết bạn phải hiểu rõ cơ chế phòng thủ của đối phương. Các website hiện đại sử dụng nhiều lớp bảo vệ tinh vi để phát hiện và ngăn chặn truy cập tự động.

Rate Limiting (Giới hạn tần suất)

Đây là tuyến phòng thủ cơ bản nhất. Hệ thống sẽ theo dõi số lượng yêu cầu (request) từ một địa chỉ IP trong một khoảng thời gian. Nếu con số này vượt ngưỡng cho phép, IP đó sẽ bị tạm thời hoặc vĩnh viễn chặn truy cập.

Phân tích User-Agent

Mỗi request gửi đi đều chứa một chuỗi User-Agent, tựa như “danh thiếp” của trình duyệt. Các thư viện Python như requests thường có User-Agent mặc định (python-requests/2.x.x). Các website dễ dàng nhận ra và chặn ngay lập tức.

Dấu vân tay trình duyệt (Browser Fingerprinting)

Các hệ thống chống bot cao cấp hơn không chỉ nhìn vào IP hay User-Agent. Chúng sử dụng JavaScript để thu thập hàng loạt thông tin như múi giờ, độ phân giải màn hình, plugins đã cài, và cả thông tin về card đồ họa (WebGL). Tập hợp này tạo ra một “dấu vân tay” độc nhất để phân biệt người thật và bot.

Hệ thống CAPTCHA

Khi nghi ngờ có truy cập tự động, website sẽ tung ra rào cản cuối cùng: CAPTCHA. Đây là bài kiểm tra được thiết kế để chỉ con người mới có thể giải được, khiến các bot đơn giản phải dừng bước.

Honeypot Traps (Bẫy mật ngọt)

Đây là một kỹ thuật thông minh. Lập trình viên sẽ đặt những liên kết “vô hình” đối với người dùng (ví dụ: có thuộc tính display: none). Người dùng thật sẽ không bao giờ nhấn vào, nhưng các scraper tự động đi theo mọi đường link sẽ sa vào bẫy và bị phát hiện ngay.

Bộ ba công cụ quyền lực giúp chống block khi scraping

Để đối phó với các lớp phòng thủ trên, chúng ta cần một bộ công cụ đủ mạnh. Sự kết hợp giữa Python, VPS, và Rotating Proxy chính là giải pháp toàn diện nhất hiện nay.

Python: Linh hoạt và mạnh mẽ

Python là ngôn ngữ thống trị trong lĩnh vực khoa học dữ liệu và web scraping. Hệ sinh thái thư viện của nó cực kỳ phong phú, giúp bạn xử lý mọi tác vụ một cách dễ dàng.

  • Requests: Gửi các yêu cầu HTTP một cách đơn giản.
  • BeautifulSoup: Phân tích và trích xuất dữ liệu từ mã HTML và XML.
  • Selenium/Playwright: Tự động hóa trình duyệt để xử lý các trang web phức tạp có nhiều JavaScript.

VPS: Môi trường hoạt động lý tưởng

VPS (Virtual Private Server) là một máy chủ ảo cá nhân. Sử dụng VPS để chạy scraper mang lại ba lợi ích chiến lược:

  1. Hoạt động 24/7: Scraper có thể chạy liên tục mà không phụ thuộc vào máy tính cá nhân của bạn.
  2. Môi trường độc lập: Một môi trường sạch, được tối ưu riêng cho tác vụ scraping.
  3. IP uy tín: VPS thường có một địa chỉ IP tĩnh, sạch và uy tín hơn so với IP từ mạng gia đình.

Rotating Proxy: “Áo choàng tàng hình” tối thượng

Đây chính là vũ khí quan trọng nhất. Rotating Proxy là một hệ thống máy chủ trung gian với hàng ngàn, thậm chí hàng triệu địa chỉ IP.

Nó hoạt động bằng cách tự động thay đổi (xoay vòng) địa chỉ IP gửi đi cho mỗi request của bạn. Website mục tiêu sẽ thấy hàng ngàn “người dùng” khác nhau đang truy cập, thay vì một IP duy nhất, khiến việc truy vết và chặn bạn gần như là không thể.

  • Residential Proxy (Proxy dân dụng): IP thật từ các nhà cung cấp dịch vụ Internet (ISP). Độ tin cậy cực cao và gần như không thể bị phát hiện.
  • Datacenter Proxy (Proxy trung tâm dữ liệu): IP từ các server. Tốc độ nhanh hơn nhưng có thể dễ bị phát hiện hơn proxy dân dụng.

Hướng dẫn thực hành: Xây dựng scraper “bất tử”

Lý thuyết đã đủ, giờ là lúc bắt tay vào thực hành. Chúng ta sẽ bắt đầu từ kỹ thuật cơ bản nhất và dần nâng cấp lên các phương pháp chuyên sâu.

Kỹ thuật cơ bản: Tải và bóc tách HTML

Đầu tiên, hãy chuẩn bị môi trường và thực hành một ví dụ hoàn chỉnh: dùng requests để tải nội dung HTML của một trang web, sau đó dùng BeautifulSoup để bóc tách và lấy ra những thông tin cụ thể.

1. Chuẩn bị môi trường trên VPS

Kết nối với VPS qua SSH và cài đặt các thư viện cần thiết:

sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip -y
pip3 install requests beautifulsoup4

2. Code mẫu: Tích hợp Proxy và trích xuất dữ liệu

Mục tiêu của đoạn code sau là truy cập trang http://example.com/, lấy tiêu đề chính (<h1>) và đoạn văn bản đầu tiên (<p>).

import requests
from bs4 import BeautifulSoup
import random

# URL mục tiêu là một trang HTML thực tế
url_to_scrape = 'http://example.com/'

# Endpoint của nhà cung cấp Rotating Proxy
# Thay thế bằng thông tin proxy của bạn
proxy_endpoint = 'http://user:[email protected]:port'

proxies = {
   'http': proxy_endpoint,
   'https': proxy_endpoint,
}

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}

try:
    # Bước 1: Dùng Requests để gửi yêu cầu và lấy mã HTML
    response = requests.get(url_to_scrape, proxies=proxies, headers=headers, timeout=15)
    response.raise_for_status() # Ném lỗi nếu request thất bại

    print("Request thành công, đã nhận được mã HTML!")

    # Bước 2: Dùng BeautifulSoup để phân tích mã HTML
    soup = BeautifulSoup(response.text, 'html.parser')

    # Bước 3: Trích xuất dữ liệu mong muốn
    page_title = soup.find('h1').get_text()
    print(f"Tiêu đề của trang là: '{page_title}'")

    page_paragraph = soup.find('p').get_text()
    print(f"Nội dung đoạn văn: '{page_paragraph}'")

except requests.exceptions.RequestException as e:
    print(f"Lỗi Request: {e}")
except AttributeError:
    print("Lỗi Phân Tích: Không tìm thấy thẻ HTML mong muốn trên trang.")

Nâng Tầm Scraper: Các Kỹ Thuật Chuyên Sâu

Khi đã nắm vững kỹ thuật cơ bản, bạn có thể gia cố scraper của mình bằng các lớp bảo vệ chuyên sâu sau:

1. Tối ưu Headers và Session

Luôn xoay vòng User-Agent và bổ sung các header quan trọng. Trong đó, Referer cho website biết bạn đến từ đâu, giúp request trông tự nhiên hơn. Sử dụng requests.Session cũng giúp duy trì cookies giữa các request.

# ... (phần code proxy ở trên)

headers_list = [
    {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'},
    {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'},
]

base_headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9',
    'Connection': 'keep-alive',
    'Referer': 'https://www.google.com/' # Giả lập người dùng đến từ Google
}

session = requests.Session()
random_headers = random.choice(headers_list)
session.headers.update({**base_headers, **random_headers})

# Từ đây, dùng session.get() thay cho requests.get()
# response = session.get(url_to_scrape, proxies=proxies, timeout=15)

2. Giả lập hành vi người dùng

Bot thường gửi request rất nhanh và đều đặn. Để giống người thật hơn:

  • Thêm độ trễ ngẫu nhiên: Dùng time.sleep(random.uniform(3, 8)) giữa các request.
  • Random hóa thứ tự URL: Trộn danh sách URL cần scrape thay vì đi theo thứ tự A-B-C.
  • Retry thông minh: Khi gặp lỗi 429 hoặc 403, đừng thử lại ngay. Hãy cho chương trình chờ một lúc (ví dụ 60 giây), sau đó request lại (lúc này proxy đã xoay IP mới).

3. Xử lý JavaScript với Headless Browser (Playwright)

Với các trang dùng nhiều JavaScript để tải nội dung, requests là không đủ. Bạn cần một trình duyệt tự động như Playwright để render trang web y hệt như một trình duyệt thật.

  • Cài đặt Playwright:
    # Cài đặt thư viện Playwright
    pip3 install playwright
    # Tải về các trình duyệt cần thiết
    playwright install
  • Code mẫu tích hợp Proxy vào Playwright:
    from playwright.sync_api import sync_playwright
    
    url_to_scrape = 'https://www.whatismybrowser.com/'
    proxy_server = 'http://proxy.provider.com:port'
    proxy_user = 'user'
    proxy_pass = 'password'
    
    def run_with_playwright():
        with sync_playwright() as p:
            browser = p.chromium.launch(
                headless=True,
                proxy={"server": proxy_server, "username": proxy_user, "password": proxy_pass}
            )
            page = browser.new_page()
            try:
                page.goto(url_to_scrape, timeout=60000)
                page.wait_for_selector('.detected-what-is-my-ip-address a', timeout=15000)
                ip_address = page.locator('.detected-what-is-my-ip-address a').inner_text()
                print(f"IP được sử dụng (nhìn từ Playwright): {ip_address}")
            except Exception as e:
                print(f"Đã xảy ra lỗi với Playwright: {e}")
            finally:
                browser.close()
    
    if __name__ == "__main__":
        run_with_playwright()

4. Vượt qua các rào cản khác

Có cách nào chống block dễ hơn không? (Có, dùng API)

Nếu việc tự xây dựng và duy trì toàn bộ hệ thống trên quá phức tạp, có một giải pháp thay thế rất hiệu quả: Web Scraping API. Các dịch vụ như ZenRows, ScraperAPI, ScrapingBee cung cấp một endpoint API duy nhất, lo toàn bộ phần việc phức tạp cho bạn.

  • Ưu điểm: Cực kỳ tiện lợi, tiết kiệm thời gian, tỷ lệ thành công rất cao.
  • Nhược điểm: Tốn chi phí và bạn ít có khả năng tùy biến sâu vào quá trình request.

Làm sao để scraping một cách có trách nhiệm?

Một scraper mạnh mẽ đi kèm với trách nhiệm lớn. Hãy luôn tuân thủ các nguyên tắc sau:

  • Kiểm tra file robots.txt: Đây là file quy định của website về việc cho phép bot truy cập. Hãy luôn tôn trọng các quy tắc này.
  • Tránh làm quá tải máy chủ: Luôn cài đặt độ trễ hợp lý giữa các request để không gây hại cho website.
  • Tuân thủ pháp lý và Điều khoản dịch vụ (ToS): Tuyệt đối không scraping dữ liệu cá nhân nhạy cảm hay vi phạm quy định của website.

Checklist chống block toàn diện

Trước khi chạy scraper, hãy kiểm tra qua danh sách này:

  • ✅ Hạ tầng: Scraper chạy trên VPS ổn định.
  • ✅ IP: Sử dụng dịch vụ Rotating Residential Proxy uy tín.
  • ✅ User-Agent: Luôn xoay vòng từ một danh sách User-Agent của các trình duyệt phổ biến.
  • ✅ Headers: Bổ sung đầy đủ các header (Accept-Language, Referer…).
  • ✅ Cookies: Dùng requests.Session để duy trì phiên làm việc.
  • ✅ Tần suất: Cài đặt độ trễ ngẫu nhiên và hợp lý giữa các request.
  • ✅ Hành vi: Random hóa thứ tự truy cập URL.
  • ✅ Nâng cao: Sẵn sàng kịch bản dùng Headless Browser và dịch vụ giải CAPTCHA.
  • ✅ Đạo đức: Đã kiểm tra robots.txt và tuân thủ các quy tắc.

Kết luận

Chống block khi scraping không phải là một trận chiến một lần mà là một quá trình liên tục cải tiến và thích ứng. Không có một giải pháp ma thuật nào, mà là sự kết hợp thông minh của nhiều lớp phòng thủ.

Đối với những ai muốn đẩy tốc độ scraping lên một tầm cao mới, bước tiếp theo là tìm hiểu về lập trình bất đồng bộ (asynchronous) trong Python với các thư viện như httpxaiohttp. Chúng cho phép bạn xử lý hàng ngàn request một cách hiệu quả mà không làm nghẽn tài nguyên hệ thống.

Hãy bắt đầu lộ trình của bạn như sau:

  • Khởi đầu: Luôn sử dụng Rotating Proxy và tùy chỉnh Headers.
  • Khi gặp khó khăn: Nâng cấp lên Headless Browser như Playwright/Selenium.
  • Khi cần quy mô lớn: Cân nhắc sử dụng các dịch vụ Web Scraping API.

Và quan trọng nhất, hãy luôn là một “công dân số” có trách nhiệm. Chúc bạn thành công trên hành trình chinh phục dữ liệu!

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

1. Sử dụng proxy miễn phí để scraping có an toàn không?

Không nên. Proxy miễn phí thường rất không đáng tin cậy, tốc độ chậm, và hay bị lỗi. Quan trọng hơn, chúng tiềm ẩn rủi ro bảo mật nghiêm trọng: có thể bị dùng để theo dõi lưu lượng truy cập của bạn, chèn quảng cáo, hoặc thậm chí là mã độc. Hầu hết các IP này cũng đã nằm trong danh sách đen của các website lớn.

2. Nên chọn Residential Proxy hay Datacenter Proxy?

Phụ thuộc vào website mục tiêu.

  • Datacenter Proxy: Nhanh, rẻ, phù hợp cho các trang web có cơ chế chống bot đơn giản.
  • Residential Proxy: IP của người dùng thật, độ tin cậy cao, khó bị phát hiện hơn rất nhiều. Hãy chọn loại này khi bạn cần scraping các website lớn, được bảo vệ kỹ càng như các trang thương mại điện tử, mạng xã hội, hay hãng hàng không.

3. Scraping dữ liệu có hợp pháp không?

Đây là một “vùng xám” pháp lý. Nhìn chung, việc scraping dữ liệu công khai thường được coi là hợp pháp. Tuy nhiên, nó có thể trở thành bất hợp pháp nếu bạn:

  • Scraping dữ liệu cá nhân, nhạy cảm.
  • Scraping nội dung có bản quyền.
  • Vượt qua các rào cản đăng nhập để lấy dữ liệu riêng tư.
  • Vi phạm rõ ràng Điều khoản Dịch vụ (ToS) của website.
  • Gây quá tải, làm hỏng hóc máy chủ của họ.

Khi có nghi ngờ, hãy luôn tham khảo ý kiến luật sư.

4. Bao lâu thì nên xoay IP một lần?

Không có câu trả lời duy nhất. Quy tắc chung là:

  • Với các mục tiêu khó: Xoay IP trên mỗi request để đạt độ ẩn danh tối đa.
  • Với các mục tiêu dễ hơn: Bạn có thể dùng chế độ “sticky session”, giữ một IP trong vài phút hoặc qua một chuỗi hành động (ví dụ: thêm vào giỏ hàng, thanh toán) để mô phỏng hành vi người dùng tự nhiên hơn.

Tài liệu tham khảo