Back to articles
Technology Insight

Xây dựng Hệ thống AI Web Scraper Đa Tầng bằng Scrapy, Browserless và Qwen2-VL trên Cloud Server

June 2, 2026

Giới thiệu xu hướng AI Web Scraping đa tầng

Trong kỷ nguyên số, dữ liệu công khai trên môi trường web trở thành nguồn tài nguyên vô giá để huấn luyện mô hình trí tuệ nhân tạo, phân tích thị trường và theo dõi đối thủ cạnh tranh. Tuy nhiên, các kỹ thuật cào dữ liệu truyền thống (Web Scraping) dựa trên việc phân tích mã nguồn HTML tĩnh đang đối mặt với hai thách thức lớn: sự phổ biến của các trang web Single Page Application (SPA) phức tạp dựa trên JavaScript và các hệ thống chống cào dữ liệu (Anti-bot) ngày càng tinh vi.

Để giải quyết triệt để bài toán này, các doanh nghiệp và chuyên gia dữ liệu đang chuyển dịch sang mô hình AI Web Scraper đa tầng. Giải pháp này không chỉ dừng lại ở việc tải trang, mà là sự kết hợp tối ưu giữa ba lớp công nghệ:

  • Lớp điều phối và quản lý luồng dữ liệu (Scrapy): Framework mã nguồn mở mạnh mẽ, có khả năng xử lý bất đồng bộ (asynchronous) với hiệu năng cực cao.
  • Lớp kết xuất giao diện (Browserless): Dịch vụ quản lý trình duyệt Headless số lượng lớn giúp thực thi JavaScript, mô phỏng hành vi người dùng và vượt qua các hệ sinh thái bảo mật chống bot.
  • Lớp phân tích và trích xuất thông minh (Qwen2-VL): Mô hình thị giác máy tính - ngôn ngữ lớn (Vision-Language Model) đột phá từ Alibaba, có khả năng "nhìn" ảnh chụp màn hình giao diện web và trích xuất dữ liệu ngữ nghĩa chính xác mà không cần phụ thuộc vào cấu trúc DOM (Xpath/CSS Selector) vốn rất dễ thay đổi.

Bài viết này sẽ hướng dẫn chi tiết cách thiết kế, triển khai và vận hành hệ thống kiến trúc cào dữ liệu tiên tiến này trên một Cloud Server chuyên dụng.

Kiến trúc tổng quan của hệ thống AI Web Scraper

Một hệ thống thu thập dữ liệu thông minh đa tầng hoạt động theo cơ chế tuần tự và bổ trợ lẫn nhau, phân tách rõ ràng trách nhiệm của từng thành phần:

Kiến trúc luồng xử lý: Scrapy (Khởi tạo Request) → Browserless (Render JS & Bypass Bot) → Chụp ảnh màn hình (Screenshot/HTML) → Qwen2-VL (Phân tích thị giác & Structured JSON Output) → Scrapy Pipeline (Lưu trữ Database).

Bằng cách tổ chức này, hệ thống giảm tải được tài nguyên cho Cloud Server do không phải chạy trực tiếp các luồng Chrome ngốn RAM, đồng thời tối đa hóa độ chính xác nhờ khả năng suy luận ngữ cảnh của mô hình ngôn ngữ lớn hàng đầu hiện nay.

Thiết lập môi trường trên Cloud Server

Để hệ thống vận hành ổn định, chúng ta cần một Cloud Server chạy hệ điều hành Ubuntu (khuyến nghị phiên bản 22.04 LTS hoặc mới hơn) được trang bị cấu hình tối thiểu 4 vCPU, 8GB RAM và tùy chọn GPU (như NVIDIA T4 hoặc A10G) nếu bạn muốn tự host mô hình Qwen2-VL cục bộ. Trong hướng dẫn này, chúng ta sẽ tối ưu hóa bằng cách gọi API của Qwen2-VL để tiết kiệm chi phí hạ tầng phần cứng.

1. Cài đặt các thư viện Python cần thiết

Đầu tiên, hãy cập nhật hệ thống và thiết lập môi trường ảo Python:

sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv -y
python3 -m venv ai_scraper_env
source ai_scraper_env/bin/activate
pip install scrapy requests pydantic openai

Chúng ta sử dụng thư viện openai vì API của dòng mô hình Qwen2-VL hiện nay đều hỗ trợ chuẩn giao tiếp tương thích hoàn toàn với cấu trúc API của OpenAI, giúp đơn giản hóa quá trình tích hợp.

Tích hợp Browserless vào Scrapy để xử lý trang web động

Browserless là giải pháp quản lý trình duyệt Headless (Chromium) trên nền tảng đám mây hoặc qua Docker Docker container. Đối với Scrapy, thay vì tải trực tiếp mã nguồn thô qua HTTP request thông thường, chúng ta sẽ gửi yêu cầu qua API endpoint của Browserless (ví dụ: /content hoặc /unblock) để nhận về mã HTML đã được render hoàn chỉnh hoặc kèm ảnh chụp màn hình.

Cấu hình mã nguồn Scrapy Spider

Dưới đây là cách triển khai một Spider cơ bản tận dụng sức mạnh của Browserless:

import scrapy
import json
import base64

class AiScraperSpider(scrapy.Spider):
    name = "ai_scraper"
    
    def start_requests(self):
        target_url = "[https://example-dynamic-shop.com/products](https://example-dynamic-shop.com/products)"
        browserless_url = "[https://production-sfo.browserless.io/screenshot?token=YOUR_BROWSERLESS_API_KEY](https://production-sfo.browserless.io/screenshot?token=YOUR_BROWSERLESS_API_KEY)"
        
        payload = {
            "url": target_url,
            "options": {
                "fullPage": True,
                "type": "jpeg",
                "quality": 85
            },
            "gotoOptions": {
                "waitUntil": "networkidle2"
            }
        }
        
        yield scrapy.Request(
            url=browserless_url,
            method="POST",
            headers={"Content-Type": "application/json"},
            body=json.dumps(payload),
            callback=self.parse_page_image
        )

Trong đoạn mã trên, chúng ta gọi endpoint /screenshot của Browserless. Trình duyệt từ xa sẽ truy cập trang web, đợi cho đến khi các tiến trình mạng lắng xuống (networkidle2), chụp lại toàn bộ màn hình giao diện và trả về dữ liệu ảnh dưới dạng nhị phân.

Sử dụng Qwen2-VL để trích xuất dữ liệu không cần XPath

Sau khi nhận được ảnh chụp giao diện từ Browserless, thách thức lớn nhất của các lập trình viên truyền thống là viết các chuỗi selector CSS/XPath phức tạp để bóc tách thông tin. Với mô hình Vision-Language như Qwen2-VL, tác vụ này trở nên đơn giản hơn bao giờ hết thông qua kỹ thuật Prompting bằng hình ảnh.

Gửi ảnh màn hình sang API Qwen2-VL

Tại hàm callback parse_page_image của Scrapy, chúng ta chuyển đổi dữ liệu ảnh nhận được sang chuỗi mã hóa Base64 và gửi trực tiếp tới mô hình Qwen2-VL nhằm trích xuất dữ liệu dưới định dạng cấu trúc JSON mong muốn:

    def parse_page_image(self, response):
        # Mã hóa hình ảnh nhận được từ Browserless sang Base64
        image_base64 = base64.b64encode(response.body).decode('utf-8')
        
        # Khởi tạo client kết nối API Qwen2-VL (Tương thích OpenAI định dạng)
        from openai import OpenAI
        client = OpenAI(api_key="YOUR_QWEN_API_KEY", base_url="[https://dashscope.aliyuncs.com/compatible-mode/v1](https://dashscope.aliyuncs.com/compatible-mode/v1)")
        
        prompt = """
        Hãy phân tích ảnh chụp màn hình trang thương mại điện tử này. 
        Trích xuất danh sách tất cả các sản phẩm bao gồm: Tên sản phẩm, Giá tiền, và Tỷ lệ đánh giá (nếu có).
        Trả về kết quả duy nhất dưới định dạng JSON mảng (Array of Objects), không kèm giải thích.
        """
        
        completion = client.chat.completions.create(
            model="qwen2-vl-72b-instruct",
            messages=[
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": prompt},
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/jpeg;base64,{image_base64}"
                            }
                        }
                    ]
                }
            ],
            response_format={"type": "json_object"}
        )
        
        extracted_data = json.loads(completion.choices[0].message.content)
        yield from extracted_data.get("products", [])

Nhờ cấu hình cơ chế response_format={"type": "json_object"}, mô hình Qwen2-VL đảm bảo dữ liệu đầu ra tuân thủ nghiêm ngặt cú pháp JSON, giúp hệ thống dữ liệu hạ tầng phía sau xử lý tự động và lưu trữ vào cơ sở dữ liệu liền mạch mà không lo lỗi cú pháp.

Tối ưu hóa hiệu năng và bảo mật hệ thống trên Cloud Server

Khi vận hành giải pháp cào dữ liệu quy mô công nghiệp (Enterprise Scale), bạn cần chú ý đến việc phân bổ tài nguyên và bảo mật luồng dữ liệu thông qua các biện pháp sau:

  • Giới hạn tần suất yêu cầu (Rate Limiting): Cấu hình tham số DOWNLOAD_DELAY và CONCURRENT_REQUESTS trong file settings.py của Scrapy để tránh việc gửi quá nhiều yêu cầu đồng thời làm quá tải hệ thống API bên thứ ba cũng như kích hoạt tường lửa phòng thủ của trang mục tiêu.
  • Tận dụng tính năng /unblock của Browserless: Với các trang web triển khai Cloudflare hoặc các hệ thống nhận diện mã độc nâng cao, thay vì dùng endpoint thông thường, hãy chuyển sang dùng /unblock API của Browserless nhằm kích hoạt chế độ Stealth tự động giả lập hành vi di chuyển chuột và vân tay trình duyệt (Canvas Fingerprinting) giống người dùng thật.
  • Quản lý biến môi trường bí mật: Tuyệt đối không hardcode các mã khóa API (API Keys) trong mã nguồn. Hãy sử dụng thư viện python-dotenv và lưu trữ các token của Browserless cũng như Qwen vào tệp .env riêng biệt được bảo vệ nghiêm ngặt trên Cloud Server.

Lời kết

Việc kết hợp Scrapy, Browserless và Qwen2-VL đại diện cho một bước nhảy vọt mang tính đột phá trong lĩnh vực khai thác dữ liệu trực tuyến. Bằng cách ủy thác việc render giao diện cho trình duyệt đám mây và áp dụng trí tuệ nhân tạo thị giác để đọc hiểu bố cục trang web, hệ thống của bạn sẽ đạt được độ bền vững (resilience) cực cao trước các thay đổi về giao diện của trang đích. Hãy triển khai giải pháp này trên các hạ tầng Cloud Server ngay hôm nay để tự động hóa quy trình nghiệp vụ thu thập thông tin cho doanh nghiệp của bạn một cách thông minh và hiệu quả nhất.

Xây dựng Hệ thống AI Web Scraper Đa Tầng bằng Scrapy, Browserless và Qwen2-VL trên Cloud Server | DPTCloud