Gemini Web Scraping Thực Sự Hiệu Quả (Có Code + Không Code)

Cập nhật lần cuối vào April 15, 2026
Gemini Web Scraping Thực Sự Hiệu Quả (Có Code + Không Code)

Hầu hết các bài hướng dẫn về “gemini web scraping” đều giống như được viết cho cùng một kiểu người: một lập trình viên Python đã có sẵn virtual environment, Pydantic schema, và quan điểm rất rõ ràng về các thư viện async. Nếu đó là bạn thì tuyệt — chúng ta sẽ đi vào phần code ngay. Nhưng nếu bạn làm sales, marketing, hoặc vận hành ecommerce và chỉ muốn lấy dữ liệu có cấu trúc từ hàng loạt trang web mà không cần học xem markdownify làm gì, thì bạn không hề đơn độc.

Gemini là họ mô hình AI đa phương thức của Google, và nó đang nhanh chóng trở thành một trong những “động cơ” phổ biến nhất cho việc trích xuất dữ liệu web. Khảo sát Stack Overflow Developer Survey 2025 cho thấy 84% lập trình viên đang dùng hoặc có kế hoạch dùng các công cụ AI — và scraping bằng LLM là một phần lớn của làn sóng đó. Nhưng khoảng cách giữa một “demo hay ho trên một URL” và một pipeline có thể xử lý phân trang, subpage, tường chống bot, cùng HTML lộn xộn ở quy mô lớn là rất xa. Hướng dẫn này sẽ bao quát cả hai hướng: dùng Python (có code) và không code, phân tích cách chọn model bằng con số token thực tế, xử lý scraping nhiều trang (phần mà hầu hết bài khác bỏ qua), và nói thẳng về những chỗ Gemini scraping dễ thất bại. Đọc xong, bạn sẽ biết con đường nào phù hợp với workflow của mình — và cách tránh những cạm bẫy mà tôi thấy cả developer lẫn người dùng business thường gặp.

Gemini Web Scraping Là Gì?

Gemini web scraping nghĩa là đưa nội dung của một trang web — HTML, Markdown, hoặc thậm chí cả ảnh chụp màn hình — vào một trong các mô hình Gemini của Google, để mô hình hiểu nội dung trang và trả về dữ liệu có cấu trúc. Không cần CSS selector. Không cần XPath. Không cần những rule dễ vỡ mà chỉ cần website đổi bố cục một chút là hỏng.

Quy trình cốt lõi thường như sau:

  1. Lấy trang web (bằng requests, trình duyệt headless, hoặc tiện ích Chrome)
  2. Làm sạch và chuyển đổi nội dung (thường là HTML → Markdown để giảm chi phí token)
  3. Gửi sang Gemini cùng schema mô tả các trường bạn muốn
  4. Nhận JSON có cấu trúc — sẵn sàng cho spreadsheet, CRM, hoặc database của bạn

So với scraping truyền thống bằng BeautifulSoup hay Selenium, nơi bạn phải hard-code selector kiểu div.product-title > span.price và cầu mong website không đổi giao diện vào tuần sau, Gemini đọc trang giống con người hơn — nó hiểu ngữ cảnh, thích nghi với thay đổi bố cục, và xử lý định dạng lộn xộn mà không cần rule tùy biến.

Một điểm đáng chú ý nữa: Gemini vốn đã là mô hình đa phương thức. Nó xử lý văn bản, hình ảnh, video, âm thanh, PDF và code trong cùng một request. Điều đó mở ra những cách scrape mà hầu hết LLM khác không làm được — ví dụ gửi ảnh chụp màn hình thay vì HTML. Chúng ta sẽ nói kỹ hơn ở phần sau.

Vì Sao Gemini Web Scraping Quan Trọng Với Các Đội Ngũ Kinh Doanh?

Nếu bạn đang tự hỏi vì sao một quản lý marketing hay analyst ecommerce lại nên quan tâm đến LLM và web scraping, câu trả lời ngắn gọn là: nó tiết kiệm rất nhiều thời gian, và không dễ hỏng mỗi khi website cập nhật.

Thị trường phần mềm web scraping được dự báo tăng trưởng từ khoảng 1 tỷ USD năm 2025 lên hơn 2 tỷ USD vào năm 2030 — và trích xuất dữ liệu bằng AI là phân khúc tăng nhanh nhất. Đây không phải là lời quảng cáo quá đà; nó phản ánh một sự chuyển dịch thực sự trong cách các đội ngũ thu thập dữ liệu.

Dưới đây là những cách Gemini scraping phù hợp với workflow kinh doanh hằng ngày:

Use CaseWhat You're ScrapingWho Benefits
Tạo leadThông tin liên hệ từ danh bạ, LinkedIn (công khai), website công tySales, BDR
Theo dõi giá đối thủGiá sản phẩm, tình trạng tồn kho, chương trình khuyến mãiEcommerce, đội pricing
Trích xuất catalog sản phẩmTên, thông số, hình ảnh, đánh giáMerchandising, vận hành marketplace
Danh sách bất động sảnThông tin tài sản, giá, thông tin môi giớiMôi giới, nhà đầu tư
Tổng hợp nội dungTin tức, bài blog, đề cập trên mạng xã hộiMarketing, PR
Nghiên cứu thị trường việc làmChức danh, mức lương, địa điểmHR, tuyển dụng

Lợi ích thực tế đến từ hai phía. Thứ nhất, bạn không còn phải lặp đi lặp lại việc viết, test và debug script parse — mô hình sẽ đọc lại trang từ đầu mỗi lần. Thứ hai, bạn không cần thuê developer mỗi khi website chỉ đổi một thẻ <div>. Gemini free tier cũng giúp việc thử nghiệm gần như không tốn chi phí ở quy mô nhỏ: khoảng 1.000 request/ngày với Flash-Lite và 100/ngày với Pro, không cần thẻ tín dụng.

Nên Chọn Model Gemini Nào? (Flash Lite vs. Flash vs. Pro)

Không phải model Gemini nào cũng phù hợp như nhau cho scraping. Đây là phần so sánh thực tế mà tôi ước bài hướng dẫn nào cũng có, vì chọn sai tier sẽ либо tốn tiền, либо cho ra dữ liệu rác.

Cả ba model Gemini 2.5 hiện tại đều có context window 1.048.576 token và đều đa phương thức. Khác biệt nằm ở chi phí, tốc độ, và khả năng xử lý các tác vụ trích xuất phức tạp.

ModelChi phí input (mỗi 1M token)Chi phí output (mỗi 1M token)Phù hợp nhất choĐộ chính xác với schema phức tạpTốc độ
Gemini 2.5 Flash Lite~$0.025~$0.10Dữ liệu phẳng đơn giản, khối lượng lớn⚠️ Khó với field lồng nhau/không bắt buộcNhanh nhất
Gemini 2.5 Flash~$0.075~$0.625Hầu hết tác vụ scraping✅ Tốt cho trích xuất có cấu trúcNhanh
Gemini 2.5 Pro~$0.3125~$2.50Schema lồng sâu, các tình huống biên✅ Chính xác nhấtChậm nhất

(Bảng giá từ Gemini Developer API. Batch API được giảm 50%.)

Gemini 2.5 Flash Lite: Rẻ Và Nhanh, Nhưng Cần Chú Ý Thiếu Hụt

Flash Lite là lựa chọn tiết kiệm. Nó rất hợp cho dữ liệu đơn giản, phẳng — tên sản phẩm, giá, danh sách một cấp — ở khối lượng lớn. Nhưng nó có vấn đề đã được ghi nhận với các field tùy chọn, timestamp và dữ liệu lồng nhau. Một developer trên forum của Google cho biết Flash Lite “phát điên” khi schema có thuộc tính không bắt buộc, sinh ra văn bản lặp đi lặp lại cho đến khi chạm giới hạn token. Nếu schema của bạn có hơn hai tầng lồng nhau, hoặc có field có thể vắng mặt ở một số trang, Flash Lite sẽ đốt token và cả sự kiên nhẫn của bạn.

Gemini 2.5 Flash: Điểm Cân Bằng Tốt Nhất Cho Phần Lớn Tác Vụ Scraping

Flash là lựa chọn tôi sẽ bắt đầu cho gần như mọi job scraping thực tế. Nó xử lý trích xuất có cấu trúc tốt, quản lý logic phân trang ổn, và chi phí input chỉ cao hơn Flash Lite khoảng 3 lần — nhưng mức tăng độ chính xác rất đáng giá. Trên các benchmark reasoning kiểu GPQA, Flash chỉ kém Pro vài điểm, nghĩa là nó xử lý tốt phần suy luận, chuẩn hóa và làm phẳng dữ liệu mà scraping thực sự cần.

Gemini 2.5 Pro: Độ Chính Xác Cao Nhất Cho Dữ Liệu Phức Tạp

Pro là công cụ dành cho độ chính xác. Hãy dùng nó khi bạn trích xuất schema lồng sâu (ví dụ: thông số sản phẩm với nhiều nhóm biến thể, mỗi nhóm có size, màu và giá riêng), hoặc khi không thể chấp nhận dữ liệu bịa ra (pháp lý, tài chính, y tế). Chi phí input của nó cao hơn Flash Lite khoảng 12 lần, nên hãy dành cho những job mà độ chính xác quan trọng hơn giá thành.

Ví Dụ Tính Chi Phí: 10.000 Trang Sản Phẩm

Giả sử bạn tiền xử lý HTML sang Markdown (và bạn nên làm vậy — sẽ nói thêm bên dưới), một trang sản phẩm điển hình sẽ giảm từ khoảng 20.000 token HTML thô xuống còn khoảng 4.000 token Markdown. JSON đầu ra vào khoảng 500 token mỗi trang.

ModelChi phí input (40M token)Chi phí output (5M token)Tổng cho 10K trang
Flash Lite$1.00$0.50~$1.50
Flash$3.00$3.13~$6.13
Pro$12.50$12.50~$25.00

Nếu không tiền xử lý Markdown (HTML thô khoảng 200M token input), các con số này sẽ tăng lên 4–5 lần. Tiền xử lý là tối ưu có tác động lớn nhất trong toàn bộ pipeline.

Code Hay Không Code: Hai Con Đường Để Gemini Web Scraping

Đây là ngã rẽ quan trọng. Nếu bạn là developer đang xây pipeline riêng, hướng Python + Gemini API cho bạn mức kiểm soát tối đa. Nếu bạn là người dùng business cần dữ liệu ngay và không muốn đụng terminal, một AI scraper không code sẽ nhanh hơn nhiều.

Tiêu chíGemini API (Python)Thunderbit (Không code)
Thời gian thiết lập15–30 phút (env, key, thư viện)< 1 phút (cài extension Chrome)
Có cần code khôngCó (Python, Pydantic)Không
Xử lý phân trangTự viết scriptCó sẵn (click hoặc infinite scroll)
Trích xuất subpageCode riêng cho từng site1 click "Scrape Subpages"
Quản lý chi phí tokenThủ công (dọn HTML, chọn model)AI engine xử lý
Tùy chọn xuất dữ liệuJSON/CSV qua scriptExcel, Google Sheets, Airtable, Notion
Phù hợp nhất choDeveloper xây pipeline riêngNgười dùng business cần dữ liệu ngay

Thunderbit là lựa chọn không code mà chúng tôi xây dựng tại Thunderbit — một Chrome extension dùng AI (bao gồm Gemini, ChatGPT, Claude, và các engine khác ở phía sau) để gợi ý field, scrape chỉ với hai cú click, và xuất dữ liệu sang công cụ bạn chọn. Tôi sẽ đi qua cả hai hướng bên dưới.

Với người dùng ưu tiên spreadsheet, Quadratic cũng là một lựa chọn đáng biết — đó là một AI spreadsheet có thể chạy web scraping bằng Gemini ngay trong bảng tính. Nhưng với các workflow bắt đầu từ một trang web đã biết trước (danh sách sản phẩm, danh bạ, cơ sở dữ liệu lead), Thunderbit thường khớp với cách người dùng suy nghĩ hơn.

Từng Bước: Gemini Web Scraping Với Python

Phần này dành cho developer. Nếu bạn muốn đi theo hướng không code, hãy bỏ qua phần này.

Trước khi bắt đầu:

  • Độ khó: Trung bình (cần biết Python)
  • Thời gian cần thiết: ~20–30 phút cho lần scrape đầu tiên
  • Bạn cần có: Python 3.10+, tài khoản Google AI Studio (miễn phí), một URL mục tiêu

Bước 1: Thiết Lập Môi Trường Python Và Gemini API Key

Tạo thư mục dự án và virtual environment, sau đó cài các thư viện cần thiết:

mkdir gemini-scraper && cd gemini-scraper
python -m venv venv && source venv/bin/activate
pip install -U google-genai requests beautifulsoup4 markdownify pydantic

Quan trọng: SDK đúng duy nhất vào năm 2026 là google-genai. Package cũ google-generativeai đã hết vòng đời vào 2025-11-30 và hiện đã bị deprecate. Nếu bạn thấy import google.generativeai as genai trong tutorial nào đó, thì code đó đã lỗi thời.

Tiếp theo, lấy API key từ Google AI Studio. Nhấn “Get API Key”, tạo key mới, rồi lưu nó dưới dạng biến môi trường:

export GEMINI_API_KEY="your-key-here"

Lúc này bạn đã có một môi trường Python hoạt động được, đầy đủ dependency và API key sẵn sàng.

Bước 2: Lấy HTML Của Trang Mục Tiêu

Dùng requests để tải trang. Ở ví dụ này, ta sẽ scrape một trang sản phẩm:

import requests

url = "https://example.com/product/widget-pro"
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
html = response.text

Nếu site dùng JavaScript nặng hoặc có chống bot, requests.get() có thể trả về một khung trang trống hoặc mã 403. Chúng ta sẽ nói về cách xử lý ở phần giới hạn — nhưng với nhiều site công khai, cách này hoạt động rất ổn.

Bước 3: Làm Sạch HTML Và Chuyển Sang Markdown

Đây là bước mà hầu hết bài viết đều nhắc đến nhưng không đo lường. HTML thô của một trang sản phẩm điển hình có thể lên tới khoảng 20.000 token. Sau khi lọc bằng BeautifulSoup và chuyển sang Markdown, bạn còn khoảng 765–4.000 token — tức giảm 5–10 lần, tiết kiệm tiền thật và giảm hallucination.

from bs4 import BeautifulSoup
from markdownify import markdownify

soup = BeautifulSoup(html, "html.parser")
main = soup.select_one("main") or soup  # chỉ lấy phần nội dung chính
markdown_content = markdownify(str(main))

Lệnh select_one("main") sẽ loại bỏ header, footer, thanh điều hướng và script — toàn là nhiễu làm tốn token và gây nhiễu cho mô hình. Nếu site không dùng thẻ <main>, hãy thử .product-detail, #content, hoặc bất kỳ vùng nào bao quanh dữ liệu thực.

Sau bước này, bạn sẽ có một chuỗi Markdown sạch chỉ chứa nội dung có ý nghĩa của trang.

Bước 4: Định Nghĩa Schema Dữ Liệu Và Gửi Sang Gemini

Dùng Pydantic để mô tả dữ liệu bạn muốn nhận lại. SDK google-genai cho phép truyền trực tiếp Pydantic BaseModel làm response_schema:

from google import genai
from google.genai import types
from pydantic import BaseModel

class Product(BaseModel):
    name: str
    price: str
    sku: str | None = None
    description: str
    sizes: list[str] = []
    colors: list[str] = []

client = genai.Client()  # đọc GEMINI_API_KEY từ env

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=f"Extract product details from this page:\n\n{markdown_content}",
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=Product,
    ),
)

product = response.parsed
print(product)

Một vài điểm dễ vấp từ danh sách bug đã được ghi nhận:

  • Không dùng Field(default=...) trong schema gửi cho Gemini — API sẽ báo ValueError. Hãy khai báo kiểu ở level type như sku: str | None = None.
  • Giữ độ lồng nhau thấp (tối đa 3 tầng). Schema quá sâu khiến Flash và Flash Lite tạo output đệ quy hoặc thiếu dấu ngoặc đóng.
  • Đánh dấu field là bắt buộc khi dùng Flash Lite, và dùng giá trị rỗng đại diện thay vì để trống — cách Flash Lite xử lý field tùy chọn là không ổn định.

Lúc này bạn sẽ có một đối tượng Product đã được parse với dữ liệu có cấu trúc từ trang web.

Bước 5: Xuất Và Lưu Dữ Liệu Đã Scrape

Lưu kết quả dưới dạng JSON hoặc CSV:

import json

with open("products.json", "w") as f:
    json.dump(product.model_dump(), f, indent=2)

Nếu muốn đẩy vào Google Sheets, bạn có thể dùng thư viện gspread. Với database, hãy serialize sang ORM bạn đang dùng. Output có cấu trúc từ Gemini đủ sạch để đưa thẳng vào hầu hết tool downstream.

Từng Bước: Gemini Web Scraping Không Cần Code (Dùng Thunderbit)

Đây là hướng dành cho người dùng business — hoặc developer không muốn viết những script scraping dùng một lần rồi bỏ.

Trước khi bắt đầu:

  • Độ khó: Cơ bản
  • Thời gian cần thiết: ~5 phút cho lần scrape đầu tiên
  • Bạn cần có: Trình duyệt Chrome, Thunderbit extension (gói miễn phí là đủ)

Bước 1: Cài Thunderbit Chrome Extension

Vào Chrome Web Store và nhấn “Add to Chrome.” Đăng ký bằng email — toàn bộ quá trình mất chưa đến một phút. So với phần thiết lập Python 15–30 phút ở trên, khác biệt rất rõ.

Bước 2: Mở Trang Mục Tiêu Và Nhấn “AI Suggest Fields”

Truy cập website bạn muốn scrape — danh sách sản phẩm, thư mục bất động sản, database lead, bất kỳ trang nào. Nhấn biểu tượng Thunderbit trên thanh công cụ trình duyệt, rồi chọn “AI Suggest Fields.”

AI của Thunderbit sẽ đọc trang và tự động đề xuất tên cột cùng kiểu dữ liệu — như “Product Name,” “Price,” “Rating,” “Image URL.” Bạn có thể chỉnh tên cột, xóa field không cần, hoặc thêm prompt AI riêng cho từng cột (ví dụ: “phân loại thành High/Medium/Low” hoặc “dịch sang tiếng Anh”).

Bạn sẽ thấy bản preview dạng bảng với các cột đã cấu hình trước khi scrape bất kỳ hàng dữ liệu nào.

Bước 3: Nhấn “Scrape” Và Kiểm Tra Kết Quả

Chỉ một cú click. Thunderbit sẽ xử lý phân trang — cả kiểu nút “Next” lẫn infinite scroll — và trích xuất dữ liệu thành một bảng có cấu trúc. Bạn có thể chọn giữa:

  • Cloud Scraping: Nhanh hơn, xử lý tối đa 50 trang song song. Hoạt động trên các site công khai.
  • Browser Scraping: Chạy ngay trong tab Chrome đã đăng nhập của bạn. Dùng cho các site cần xác thực (CRM, thư mục có khóa, công cụ nội bộ).

Kết quả xuất hiện ngay trong sidebar của extension dưới dạng bảng. Hãy rà soát các lỗi hiển nhiên trước khi xuất.

Bước 4: Xuất Sang Excel, Google Sheets, Airtable Hoặc Notion

Nhấn nút export và chọn định dạng. Thunderbit xuất trực tiếp sang Excel, Google Sheets, Airtable và Notion — miễn phí, không bị chặn bởi paywall. Field ảnh cũng được upload thẳng vào thư viện ảnh của Notion và Airtable, rất tiện nếu bạn scrape ảnh sản phẩm hoặc ảnh chân dung.

Không cần parse JSON. Không cần viết script. Dữ liệu sẵn sàng để dùng ngay.

Scraping Nhiều Trang Và Subpage Với Gemini

Hầu hết tutorial thường kết thúc lặng lẽ sau một URL. Công việc scraping thực tế thì không.

Scraping 500 trang sản phẩm có phân trang và subpage chi tiết là một job thực thụ — và khoảng cách giữa một demo một URL với thực tế đó là rất lớn.

Xử Lý Phân Trang Với Gemini API (Cách Có Code)

Với URL theo số trang (pattern phổ biến nhất), hãy lặp qua các trang cho đến khi nhận được kết quả rỗng:

import time

all_products = []
for page in range(1, 101):  # tối đa 100 trang
    url = f"https://example.com/products?page={page}"
    md = fetch_clean(url)  # hàm HTML→Markdown bạn đã tạo ở trên
    
    response = client.models.generate_content(
        model="gemini-2.5-flash-lite",  # rẻ cho trang danh sách
        contents=f"Extract product names and URLs:\n\n{md}",
        config=types.GenerateContentConfig(
            response_mime_type="application/json",
            response_schema=list[ListingItem],
        ),
    )
    items = response.parsed
    if not items:
        break
    all_products.extend(items)
    time.sleep(4)  # tôn trọng rate limit của free tier

Với site dùng cursor hoặc infinite scroll, bạn sẽ cần chặn endpoint XHR mà frontend gọi (xem tab Network trong trình duyệt) và lặp trực tiếp trên endpoint đó. Rẻ hơn nhiều so với render lại trang, và bạn chỉ nên đưa dữ liệu qua Gemini nếu cần LLM làm sạch field.

Hãy để ý chi phí token ở đây — mỗi trang là một lần nhân chi phí lên. Dùng Flash Lite cho trang danh sách đơn giản và chỉ nâng lên Flash khi cần trích xuất chi tiết.

Scrape Subpage Để Lấy Dữ Liệu Phong Phú Hơn (Cách Có Code)

Mô hình hai giai đoạn kinh điển: Giai đoạn 1 scrape trang danh sách để lấy URL, Giai đoạn 2 ghé từng trang chi tiết để lấy dữ liệu sâu hơn.

# Giai đoạn 1: lấy URL bằng Flash Lite rẻ hơn
class Listing(BaseModel):
    product_urls: list[str]

listing = client.models.generate_content(
    model="gemini-2.5-flash-lite",
    contents=f"Extract product URLs:\n{listing_md}",
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=Listing,
    ),
).parsed

# Giai đoạn 2: lấy chi tiết bằng Flash
class ProductDetail(BaseModel):
    name: str
    price: str
    specs: dict[str, str]
    reviews: list[str]

for url in listing.product_urls:
    md = fetch_clean(url)
    detail = client.models.generate_content(
        model="gemini-2.5-flash",
        contents=f"Extract product detail:\n{md}",
        config=types.GenerateContentConfig(
            response_mime_type="application/json",
            response_schema=ProductDetail,
        ),
    ).parsed
    # lưu detail...
    time.sleep(0.5)

Cách này hoạt động, nhưng cần rất nhiều phần phụ trợ: khử trùng lặp URL, xử lý lỗi, giới hạn tốc độ, retry logic, cache HTML thô để khi đổi schema không phải fetch lại từ đầu. Với 50 trang thì còn chịu được. Với 5.000 trang, bạn đang xây hạ tầng.

Lựa Chọn Không Code: Pagination Và Subpage Tích Hợp Sẵn Của Thunderbit

Thunderbit tự động xử lý phân trang kiểu click và infinite scroll — không cần viết vòng lặp. Với subpage enrichment, tính năng “Scrape Subpages” sẽ ghé từng trang chi tiết được liên kết từ trang danh sách và làm giàu bảng gốc bằng các field sâu hơn. Một cú click, không phải một script.

Chế độ cloud scraping có thể xử lý tối đa 50 trang song song, và điều đó tạo khác biệt rõ rệt khi bạn scrape catalog sản phẩm hoặc danh bạ bất động sản ở quy mô lớn. Với bất kỳ ai không muốn quản lý Python loop và retry logic, đây là lựa chọn thực tế hơn. (Nếu bạn muốn đọc thêm về scrape dữ liệu từ website vào Excel, chúng tôi có bài hướng dẫn riêng.)

Screenshot Scraping: Lối Tắt Đa Phương Thức Của Gemini

Đây là một cách mà hầu hết tutorial bỏ qua hoàn toàn: gửi ảnh chụp màn hình của trang web tới vision API của Gemini thay vì HTML thô. Một developer đã báo cáo rằng một screenshot duy nhất chỉ tốn khoảng 258 token — trong khi HTML dù đã làm sạch vẫn có thể lên tới hàng nghìn token. Đó là chênh lệch chi phí rất lớn cho các tác vụ trích xuất đơn giản.

Cách Dùng Gemini Vision API Cho Web Scraping

Chụp màn hình bằng Playwright, mã hóa, rồi gửi sang Gemini:

from playwright.sync_api import sync_playwright
from google import genai
from google.genai import types
from pydantic import BaseModel

class Product(BaseModel):
    title: str
    price: str

with sync_playwright() as p:
    page = p.chromium.launch().new_page()
    page.goto("https://example.com/product/widget-pro")
    page.wait_for_load_state("networkidle")
    png_bytes = page.screenshot(full_page=False)  # chỉ phần hiển thị đầu trang

client = genai.Client()
resp = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=[
        {"inline_data": {"mime_type": "image/png", "data": png_bytes}},
        "Extract the product title and price as JSON.",
    ],
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=Product,
    ),
)
print(resp.parsed)

Theo tài liệu token cho ảnh của Google, một ảnh có cả hai chiều nhỏ hơn hoặc bằng 384 pixel sẽ tốn 258 token. Ảnh lớn hơn được chia thành các khối 768×768, mỗi khối 258 token. Một screenshot ngắn chỉ hiển thị phần đầu trang (258–1.600 token) vẫn rẻ hơn rất nhiều — nhưng một full-page screenshot rất dài (~5.000 token) thực ra có thể đắt hơn Markdown sạch (~765–1.200 token).

Hạn Chế Của Screenshot Scraping

  • Độ chính xác thấp hơn với bảng dày đặc: Layout nhiều cột, font nhỏ, và các phần chồng lấn có thể khiến đọc thiếu dữ liệu — không phải hallucination, mà là thiếu nhãn hoặc lệch header.
  • Không thể theo link: Vision trả về text, không phải anchor có thể click. Không phân trang, không subpage enrichment.
  • Giới hạn độ phân giải: Text nhỏ hơn khoảng 10 px thường bị đọc sai. Google sẽ downsample ảnh xuống khoảng 1.568 px ở cạnh dài nhất.
  • Chi phí capture: Khởi động Playwright + chờ networkidle mất 2–5 giây mỗi trang, và sẽ cộng dồn rất lớn ở quy mô lớn.

Screenshot scraping rất mạnh với các trang nặng JavaScript, site chặn bot (khi requests.get() trả 403 nhưng trình duyệt vẫn render bình thường), và các trang có dữ liệu nằm trong biểu đồ hoặc hình ảnh. Với trang dài và nhiều văn bản, Markdown vẫn là lựa chọn tốt hơn.

Việc scrape ảnh và PDF của Thunderbit dùng cách tiếp cận AI-vision tương tự — chỉ cần thả ảnh hoặc PDF vào và nó sẽ trả về bảng dữ liệu có cấu trúc, không cần tự viết screenshot script hay xử lý base64. (Xem thêm: cách chuyển ảnh sang Excel.)

Khi Gemini Web Scraping Thất Bại (Và Nên Làm Gì)

Gemini là công cụ trích xuất, không phải công cụ lấy dữ liệu. Nếu bạn không đưa được nội dung trang vào Gemini, nó cũng không giúp được gì. Hết.

Có một số tình huống rất phổ biến khiến toàn bộ cách tiếp cận này thất bại, và đa số tutorial đều xem nhẹ chúng. Tôi muốn nói thẳng hơn.

Hạn chếĐiều xảy raCách khắc phục
Anti-bot / CloudflareRequest API bị chặn; requests.get() trả 403 hoặc trang thử tháchDùng proxy với xoay TLS fingerprint, hoặc công cụ dựa trên trình duyệt (browser scraping của Thunderbit dùng session đã đăng nhập của bạn)
Giới hạn context windowTrang quá lớn vượt quá context hữu ích (~200K–300K cho trích xuất ổn định, dù lý thuyết hỗ trợ tới 1M)Dọn HTML→Markdown, chia nhỏ trang, hoặc dùng screenshot
Hallucination trên nội dung trực quanGemini đoán từ alt text hoặc caption thay vì nội dung ảnh thậtValidate output; dùng vision API đúng cách cho dữ liệu ảnh; thêm grounding validator
Rate limit APIBị giới hạn ở quy mô lớn — free tier khoảng 100 RPD với Pro, 1.000 RPD với Flash LiteQuản lý queue, batching (giảm 50%), hoặc chuyển sang tool dựng sẵn
Trích xuất không nhất quán (model Lite)Bỏ sót hoặc bịa field tùy chọn, timestamp và dữ liệu lồng nhauNâng lên Flash/Pro, hoặc thêm ràng buộc schema rõ hơn
Site được bảo vệ (LinkedIn, v.v.)Trả lỗi hoặc dữ liệu trốngScrape bằng trình duyệt với session đang hoạt động (Thunderbit hỗ trợ); tuân thủ điều khoản sử dụng

Một vài điểm cần thêm ngữ cảnh.

Anti-bot hiện nay đã biết nhận diện LLM. Cloudflare chặn AI crawler mặc định từ tháng 7/2025, với 416 tỷ request bot AI bị chặn trong 5 tháng đầu. Datadome cũng bổ sung phát hiện riêng cho LLM trong năm 2025 và ghi nhận lưu lượng bot LLM tăng gấp bốn. Một cách đơn giản requests.get() + Gemini gần như vô tác dụng với site được Datadome bảo vệ. Vấn đề nằm ở fingerprint, không phải IP — đổi IP thôi không giải quyết gì nếu TLS fingerprint vẫn hét lên “Python requests.”

Hallucination thường rất tinh vi. Các LLM được huấn luyện để “hữu ích” thường sẽ điền field tùy chọn bằng dữ liệu có vẻ hợp lý thay vì trả null. Tôi đã thấy model đoán thương hiệu sản phẩm từ slug URL, suy ra tiền tệ từ TLD, và tự bịa số lượng review nghe có vẻ đúng từ các skeleton loader. Bộ công cụ giảm thiểu gồm: schema Pydantic chặt chẽ, vòng retry có phản hồi validation, grounding validator kiểm tra giá trị trích xuất có thật sự xuất hiện trong HTML nguồn hay không, và two-pass extraction (Flash trích xuất, Pro xác minh một mẫu).

Context window 1M không thể dùng như 1M. Nghiên cứu của Chroma và các bên khác cho thấy chất lượng suy luận giảm trước khi chạm ngưỡng token tối đa. Hãy coi khoảng 200K–300K token là trần thực tế cho trích xuất có cấu trúc.

Sơ Đồ Quyết Định: Nên Dùng Công Cụ Nào?

  • Khối lượng thấp + trang đơn giản + developer → Gemini API free tier + Python
  • Khối lượng trung bình + schema phức tạp + developer → Gemini 2.5 Flash trả phí + Python + structured outputs + preprocessing
  • Bất kỳ khối lượng nào + không phải developer + bị chặn đăng nhập hoặc phân trang nặngThunderbit
  • Khối lượng rất lớn + chống bot mạnh + nhiệm vụ quan trọng → Hạ tầng scraping được quản lý (dịch vụ proxy) + Gemini làm lớp trích xuất

Mẹo Gemini Web Scraping Để Tiết Kiệm Thời Gian Và Chi Phí

Dù bạn đang viết Python hay bấm nút, những mẹo này sẽ giúp đỡ mất công rất nhiều.

  1. Luôn tiền xử lý HTML sang Markdown trước khi gửi vào Gemini. Tiết kiệm 5–10 lần token là chuyện thường gặp; có thể tiết kiệm tới 95% nếu bạn còn cắt gọn bằng BeautifulSoup.
  2. Chỉ dùng google-genai. Đừng dùng package google-generativeai đã bị deprecate — nó đã EOL.
  3. Chỉ bắt đầu với Flash Lite khi schema phẳng. Nâng lên Flash ngay khi có nesting hoặc field tùy chọn.
  4. Không dùng Field(default=...) trong Pydantic schema mà bạn gửi cho Gemini. Hãy khai báo kiểu như sku: str | None = None.
  5. Pydantic + response_schema là phần cốt lõi — vừa là hợp đồng dữ liệu, vừa là rào chắn chống hallucination.
  6. Dùng Batch API cho job trên 1.000 trang — giảm 50% và không tính vào RPM thời gian thực.
  7. Tự tay kiểm tra ngẫu nhiên 10–50 dòng mẫu trước khi mở rộng extractor mới. Sai lệch độ chính xác thường không thấy cho tới khi kiểm.
  8. Cache HTML thô ra disk — đổi schema không nên khiến bạn phải fetch lại từ đầu.
  9. Ghi lại source URL ở mọi dòng để bạn có thể crawl lại từng trang riêng lẻ mà không cần chạy lại toàn bộ job.
  10. Với người dùng không code: dùng custom AI prompt cho từng cột trong Thunderbit để đưa prompt engineering xuống lớp spreadsheet — dịch, phân loại, tóm tắt ở cấp cột.

Và thêm một điều nữa: đừng đem free tier vào production. Giới hạn đã bị cắt 50–80% vào tháng 12/2025 và có thể tiếp tục bị cắt nữa mà không báo trước.

Kết Luận

Khoảng cách giữa một demo Gemini trên một URL và một pipeline production thực sự lớn hơn nhiều so với những gì các tutorial thường nói.

Con đường Python + Gemini API cho developer toàn quyền kiểm soát model selection, preprocessing, pagination và schema design. Con đường không code — các công cụ như Thunderbit — cho người dùng business khả năng trích xuất dữ liệu có cấu trúc tương tự mà không cần đụng terminal.

Điều tôi muốn bạn nhớ là:

  • Chọn model rất quan trọng. Flash Lite cho khối lượng lớn, Flash cho sự cân bằng, Pro cho độ phức tạp. Đừng mặc định chọn rẻ nhất rồi ngạc nhiên vì dữ liệu sai.
  • Scraping nhiều trang và subpage chính là chỗ tutorial thường thiếu — và cũng là nơi công việc thực tế diễn ra. Cả hai hướng trong bài này đều đã xử lý phần đó.
  • Nói thẳng về giới hạn sẽ tiết kiệm thời gian. Nếu một site chặn API request, thì prompt engineering giỏi đến đâu cũng không cứu được. Hãy chọn đúng công cụ cho đúng việc, không phải công cụ “ngầu” nhất.
  • Tiền xử lý HTML sang Markdown là tối ưu mang lại lợi ích lớn nhất — nó cắt chi phí hơn 75% và giảm hallucination.

Nếu bạn muốn thử hướng không code, gói miễn phí của Thunderbit cho phép bạn scrape một vài trang và tự xem kết quả. Nếu bạn thích code, free tier của Gemini API cũng đủ để prototype một pipeline trong một buổi chiều. Dù theo cách nào, bạn cũng sẽ có dữ liệu có cấu trúc nhanh hơn rất nhiều so với việc copy-paste thủ công. Nếu muốn đọc thêm về trích xuất dữ liệu từ website sang Excel hoặc các AI web scraper tốt nhất, chúng tôi đã phân tích rất kỹ trên blog.

Dùng thử Thunderbit cho AI Web Scraping Get Started Free

Câu Hỏi Thường Gặp

Dùng Gemini để web scraping tốn bao nhiêu?

Gemini API có free tier với khoảng 100 request/ngày cho Pro, 500/ngày cho Flash, và 1.000/ngày cho Flash Lite (tính đến đầu 2026 — các giới hạn này đã bị giảm vào tháng 12/2025). Ở tier trả phí, việc scrape 10.000 trang sản phẩm tốn khoảng 1,50 USD với Flash Lite, 6 USD với Flash, hoặc 25 USD với Pro — với giả định bạn đã chuyển HTML sang Markdown trước. Nếu không tiền xử lý, chi phí sẽ tăng 4–5 lần. Batch API có giảm giá 50% cho các job không cần realtime.

Gemini có scrape được website cần đăng nhập không?

Riêng API của Gemini không thể tự đăng nhập vào website — nó chỉ xử lý nội dung bạn gửi cho nó. Bạn cần tự lấy HTML bằng session đã xác thực của mình (ví dụ dùng trình duyệt headless và cookie đã lưu). Chế độ Browser Scraping của Thunderbit xử lý chuyện này natively: nó chạy ngay trong tab Chrome đã đăng nhập của bạn, nên bất kỳ site nào bạn thấy trong trình duyệt, Thunderbit đều có thể scrape.

Web scraping bằng Gemini có hợp pháp không?

Tính hợp pháp phụ thuộc vào điều khoản sử dụng của website, loại dữ liệu, và khu vực pháp lý của bạn. Ở Mỹ, sau các vụ hiQ v. LinkedInMeta v. Bright Data, việc scrape dữ liệu công khai mà không đăng nhập thường được xem là được phép — nhưng mỗi trường hợp đều phụ thuộc vào chi tiết cụ thể. Scrape phía sau login có rủi ro pháp lý cao hơn. Dữ liệu cá nhân của cư dân EU vẫn chịu GDPR dù website có công khai hay không. Luôn tôn trọng robots.txt và điều khoản sử dụng, và tránh scrape dữ liệu cá nhân khi không có cơ sở pháp lý phù hợp.

Tôi có thể dùng Gemini để scrape các site JavaScript động không?

Có, nhưng bạn cần render JavaScript trước — либо bằng trình duyệt headless (Playwright, Puppeteer) hoặc chặn trực tiếp các endpoint API mà site gọi. Khi đã có HTML đã render, hãy làm sạch nó và gửi sang Gemini như bình thường. Hoặc bạn có thể dùng screenshot scraping với vision API của Gemini để bỏ qua hoàn toàn bước render JS — miễn là trình duyệt render được thì Gemini cũng nhìn thấy được. Thunderbit xử lý các trang render bằng JS tự động ở cả chế độ Cloud và Browser scraping.

Dùng Gemini để scrape khác gì so với công cụ chuyên dụng như Thunderbit?

Gemini là công cụ trích xuất — nó hiểu nội dung và trả về dữ liệu có cấu trúc. Nó không tự đi vào website, không xử lý phân trang, không quản lý đăng nhập, cũng không xuất dữ liệu ra spreadsheet. Bạn vẫn cần một công cụ để đưa nội dung trang vào Gemini và một công cụ để làm gì đó hữu ích với output. Các công cụ chuyên dụng như Thunderbit gộp việc lấy dữ liệu, render, trích xuất bằng AI, phân trang, làm giàu subpage và xuất dữ liệu thành một gói duy nhất — không cần lo phần nối ghép.

Tìm hiểu thêm

Shuai Guan
Shuai Guan
CEO tại Thunderbit | Chuyên gia Tự động hóa Dữ liệu AI Shuai Guan là CEO của Thunderbit và là cựu sinh viên ngành Kỹ thuật của University of Michigan. Với gần một thập kỷ kinh nghiệm trong lĩnh vực công nghệ và kiến trúc SaaS, anh chuyên biến các mô hình AI phức tạp thành những công cụ trích xuất dữ liệu thực tiễn, không cần viết mã. Trên blog này, anh chia sẻ những góc nhìn thẳng thắn, đã được kiểm chứng qua thực chiến về web scraping và các chiến lược tự động hóa, giúp bạn xây dựng quy trình làm việc thông minh hơn, dựa trên dữ liệu. Khi không tối ưu hóa quy trình dữ liệu, anh áp dụng sự tỉ mỉ đó vào niềm đam mê nhiếp ảnh.

Thử Thunderbit

Scrape lead và dữ liệu khác chỉ với 2 cú nhấp. Vận hành bằng AI.

Nhận Thunderbit Miễn phí
Trích xuất dữ liệu bằng AI
Dễ dàng chuyển dữ liệu sang Google Sheets, Airtable hoặc Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week