🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Gemini Web Scraping: Trích xuất theo schema đầu tiên bằng Python

Isabella Garcia
Isabella Garcia

Web Data Collection Specialist

29-Jul-2026

Tóm tắt:

  • Cấp độ flash rẻ của Gemini được xây dựng chính xác cho công việc này. Cung cấp cho nó một trang đã được kết xuất và một lược đồ nghiêm ngặt, nó trả về các bản ghi đã được xác thực — một lần chạy trực tiếp trong hướng dẫn này đã thu thập tất cả 20 sản phẩm từ một trang danh mục dài 50,449 ký tự với 12,904 token trên một mô hình flash-lite.
  • Lược đồ trước, lời nhắc sau. API Gemini hiện tại nhận một lược đồ JSON được lấy từ Pydantic trong chính yêu cầu, vì vậy tên và loại trường được áp dụng bởi API thay vì chỉ yêu cầu trong văn bản.
  • Những gì Gemini không giải quyết là việc lấy trang. Mô hình không thể kết xuất JavaScript, giữ phiên hoặc vượt qua các thách thức truy cập ở khối lượng bạn chọn — một lớp lấy dữ liệu làm điều đó, và việc lấy dữ liệu trong hướng dẫn này là một POST cho mỗi trang qua API Thu thập Dữ liệu Chung Scrapeless.
  • Chi phí token theo dõi kích thước trang, do đó chất lượng lấy dữ liệu là kiểm soát chi phí. Gửi nội dung đã được tinh chỉnh, kết xuất thay vì các lần lấy bị hỏng hoặc quá khổ là sự khác biệt giữa số xu và tiền thật khi quy mô.
  • Chưa có khóa Google? Các lần trích xuất tương tự chạy qua OpenRouter. Hướng dẫn này đã thực hiện trực tiếp trên google/gemini-2.5-flash-lite và cho thấy đầu ra đã được ghi lại.
  • Miễn phí để bắt đầu ở phía lấy dữ liệu. Tạo khóa API Scrapeless của bạn tại app.scrapeless.com.

Gemini có thể lấy dữ liệu từ trang web không?

Gemini trích xuất; nó không thu thập. Đưa văn bản trang cho mô hình và một lược đồ, nó trả về các bản ghi sạch — phần này thực sự xuất sắc, và rẻ trên cấp độ flash. Nhưng một đường ống thu thập dữ liệu cũng phải lấy các trang cụ thể, kết xuất JavaScript của chúng, và làm điều đó ở một khối lượng và nhịp điệu mà bạn kiểm soát, và không có điều đó nằm trong API của mô hình ngôn ngữ.

Google cung cấp công cụ ngữ cảnh URL để API đọc liên kết bạn gửi vào, và nó đáng để được định hình một cách trung thực: tiện lợi cho các lần đọc một lần, nhưng bạn thừa kế việc lấy dữ liệu — không kiểm soát hành vi kết xuất, địa lý, hoặc điều gì xảy ra khi một trang thách thức việc truy cập tự động. Việc trích xuất trong sản xuất giữ các lớp tách biệt: một lớp lấy dữ liệu mà bạn kiểm soát, rồi Gemini như là trình phân tích.

Một sự phân biệt, vì từ khóa có nghĩa hai chiều: hướng dẫn này chỉ định Gemini ở web như một công cụ trích xuất. Việc ghi lại các câu trả lời của chính Gemini dưới dạng dữ liệu là công việc ngược lại — đó là hướng dẫn API Gemini Scraper, và giải thích LLM scraper bao trùm danh mục đó.

Cài đặt

Hai khách hàng: SDK của Google cho đường dẫn gốc và requests cho lớp lấy dữ liệu. Các lần chạy trong hướng dẫn này đã sử dụng Python 3.12:

bash Copy
pip install google-genai requests

Cấu hình

Cả hai khóa đến từ môi trường:

bash Copy
export GEMINI_API_KEY="your_google_ai_studio_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

Lấy một trang đáng để trích xuất

Mục tiêu demo là một trang danh mục của hiệu sách công cộng được xây dựng cho thực hành thu thập dữ liệu — 20 sản phẩm, mỗi sản phẩm có tiêu đề, giá cả, cờ kho và xếp hạng sao nằm sâu trong HTML trình bày. Một POST đến Universal Scraping API trả về trang với rendering, giải khóa, và định tuyến proxy được xử lý ở phía server:

python Copy
# fetch_catalogue.py — một POST trả về trang danh mục đã được kết xuất
import os

import requests

resp = requests.post(
    "https://api.scrapeless.com/api/v1/unlocker/request",
    headers={
        "Content-Type": "application/json",
        "x-api-token": os.environ["SCRAPELESS_API_KEY"],
    },
    json={
        "actor": "unlocker.webunlocker",
        "input": {"url": "https://books.toscrape.com/catalogue/page-1.html", "method": "GET"},
    },
    timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")
print(f"đã lấy {len(html):,} ký tự")
print("thẻ sản phẩm trong HTML:", html.count('<article class="product_pod">'))

with open("page.html", "w", encoding="utf-8") as f:
    f.write(html)

Chạy lệnh in ra 50,449 ký tự và 20 thẻ sản phẩm. Con số 50k này quan trọng sau này: đó là những gì Gemini sẽ đọc, và những gì bạn sẽ trả phí token.

Triển khai cơ bản: trích xuất theo lược đồ trước

API Gemini hiện tại chấp nhận một lược đồ JSON trong yêu cầu, và cách sạch nhất để sản xuất một cái là một mô hình Pydantic — ngôn ngữ lược đồ tự nó là cái mà được định nghĩa bởi tiêu chuẩn JSON Schema. Đánh giá trên trang này sống trong một lớp CSS hơn là văn bản, vì vậy lược đồ và quy tắc hệ thống chỉ rõ cách đọc chúng.

Lưu ý: Khối này cần có GEMINI_API_KEY — điều kiện tiên quyết mà hướng dẫn này không giả định. Phần tiếp theo chạy quá trình trích xuất giống hệt trực tiếp qua OpenRouter, cùng với đầu ra đã được ghi lại. Bề mặt yêu cầu chính xác được tài liệu hóa trong hướng dẫn đầu ra có cấu trúc Gemini.

python Copy
# extract_gemini.py — trích xuất Gemini gốc (cần GEMINI_API_KEY)
from google import genai
from pydantic import BaseModel


class Book(BaseModel):
    title: str
    price_gbp: float
    in_stock: bool
    rating: int


class Catalogue(BaseModel):
    books: list[Book]


client = genai.Client()  # đọc GEMINI_API_KEY từ môi trường
page_html = open("page.html", encoding="utf-8").read()

interaction = client.interactions.create(
    model="gemini-3.5-flash",
    input="Trích xuất mọi cuốn sách. Đánh giá từ 1-5, đọc từ tên lớp đánh giá sao.\n\n" + page_html,
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": Catalogue.model_json_schema(),
    },
)
print(interaction)

Lược đồ thực hiện việc ràng buộc: price_gbp trở lại dưới dạng số, in_stock dưới dạng boolean, rating dưới dạng số nguyên — không cần dọn dẹp chuỗi hậu kỳ.

Không có khóa Google? Chạy nó qua OpenRouter

Quá trình trích xuất cũng chạy qua bề mặt tương thích với OpenAI với một mô hình Gemini phía sau, đây chính là cách mà hướng dẫn này thực hiện từ đầu tới cuối — lấy và trích xuất trong một tập lệnh độc lập:

python Copy
# extract_openrouter.py — cùng một quá trình trích xuất, thực hiện qua OpenRouter
import json
import os

import requests
from openai import OpenAI

resp = requests.post(
    "https://api.scrapeless.com/api/v1/unlocker/request",
    headers={
        "Content-Type": "application/json",
        "x-api-token": os.environ["SCRAPELESS_API_KEY"],
    },
    json={
        "actor": "unlocker.webunlocker",
        "input": {"url": "https://books.toscrape.com/catalogue/page-1.html", "method": "GET"},
    },
    timeout=120,
)
resp.raise_for_status()
page_html = resp.json().get("data", "")

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.environ["OPENROUTER_API_KEY"],
)

completion = client.chat.completions.create(
    model="google/gemini-2.5-flash-lite",
    temperature=0,
    max_tokens=4000,
    response_format={"type": "json_object"},
    messages=[
        {
            "role": "system",
            "content": 'Trích xuất mọi cuốn sách. Phản hồi CHỈ với JSON: '
            '{"books":[{"title":str,"price_gbp":number,"in_stock":bool,"rating":int}]}. '
            "Đánh giá từ 1-5, đọc từ tên lớp đánh giá sao.",
        },
        {"role": "user", "content": page_html},
    ],
)

data = json.loads(completion.choices[0].message.content)
print(f"trích xuất {len(data['books'])} cuốn sách")
print(json.dumps(data["books"][0], ensure_ascii=False))

Chạy trực tiếp đã trả về tất cả 20 sản phẩm, bản ghi đầu tiên:

text Copy
trích xuất 20 cuốn sách
{"title": "A Light in the Attic", "price_gbp": 51.77, "in_stock": true, "rating": 3}

Giá đã được phân tích dưới dạng số thực, hàng tồn kho là một boolean, và đánh giá ba sao đã được đọc chính xác từ tên lớp — từ 50k ký tự HTML danh mục, trong một lần gọi, cho 12,904 token với một mô hình có giá trong phần triệu đô la.

Nhận khóa API của bạn trong gói miễn phí: app.scrapeless.com

Mẫu nâng cao: kinh tế token

Chi phí trích xuất chủ yếu phụ thuộc vào đầu vào, vì vậy lớp lấy dữ liệu cũng là lớp ngân sách.

  • Đo lường số token trên mỗi trang từ sớm. Chạy trên chi phí 12,904 token cho một trang danh mục. Nhân với số lượng trang của bạn trước khi quyết định vào một bậc mô hình, không phải sau khi nhận hóa đơn.
  • Cắt gọn trước khi bạn gửi. Các phần bổ sung là một loại thuế. Tách rời container sản phẩm, hoặc lấy các trang dưới dạng markdown thay vì HTML thô, sẽ giảm kích thước đầu vào — thường là hơn một nửa — mà không mất nội dung có thể trích xuất.
  • Giữ ở mức bậc flash cho công việc với lược đồ. Một lược đồ nghiêm ngặt và temperature=0 biến trích xuất thành một nhiệm vụ có ràng buộc; chạy trên không cần gì lớn hơn. Tăng kích thước mô hình chỉ khi các trường trả về sai trên đầu vào đã sạch.
  • Không lưu trữ gì trong prompt. Lược đồ sống trong thông điệp hệ thống một lần cho mỗi cuộc gọi; không dán các ví dụ của các trang trước vào các cuộc gọi mới — điều này làm phồng đầu vào và khiến mô hình lặp lại các bản ghi đã lỗi thời.

Khắc phục sự cố

  • Các trường trở về dưới dạng chuỗi. Lược đồ của bạn không tới được API — kiểm tra xem cuộc gọi gốc có gửi schema (hoặc cuộc gọi OpenRouter có gửi hợp đồng JSON trong thông điệp hệ thống) thay vì chỉ mô tả các trường một cách lỏng lẻo trong văn bản hay không.
  • Không có sản phẩm nào hoặc chỉ có ba sản phẩm từ một trang 20 sản phẩm. Kiểm tra HTML được lấy trước: đếm số thẻ sản phẩm như cách mà tập lệnh lấy dữ liệu thực hiện. Một lần lấy gần như trống rỗng là một vấn đề về hiển thị hoặc truy cập — một vấn đề cần sửa chữa ở lớp lấy dữ liệu, không phải ở prompt.
  • Các xếp hạng đều trở lại là 5. Giá trị được mã hóa trong markup, không phải văn bản. Nói rõ nơi nó sống ("đọc từ tên lớp xếp hạng sao"), như cả hai khối trích xuất ở đây làm.
  • Chi phí nhảy giữa các lần chạy. So sánh kích thước đầu vào; một thiết kế lại mà gấp đôi trọng lượng trang thì gấp đôi hóa đơn token của bạn. Cắt giảm và lấy markdown là các đòn bẩy.

Kết luận

Tier flash của Gemini cộng với một schema nghiêm ngặt biến một trang danh mục 50k ký tự thành 20 bản ghi đã gõ cho vài đồng — đó là phần trích xuất, và đó là phần dễ dàng hiện tại. Phần quyết định liệu các bản ghi có tồn tại hay không là quá trình lấy dữ liệu: được render, kiểm soát, một POST cho mỗi trang. Giữ các lớp riêng biệt, đo lường token mỗi trang, và cùng bốn mươi dòng đó có thể mở rộng từ một cửa hàng sách demo đến một danh mục thực sự.

Sẵn sàng để Cung cấp các Trang Thực cho Gemini?

Lớp lấy dữ liệu ở đây là API Lấy Dữ Liệu Toàn Cầu — các kế hoạch và khối lượng yêu cầu có trên trang báo giá, và tài liệu cho nhà phát triển bao quát mọi tham số unlocker.webunlocker. Tạo một khóa trên kế hoạch miễn phí tại app.scrapeless.com và việc lấy dữ liệu từ danh mục ở trên sẽ chạy như đã viết.

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

H: Gemini có thể truy cập trực tiếp vào các trang web không?

Chỉ thông qua công cụ URL-context của Google, mà lấy một liên kết từ phía máy chủ để đọc một lần. Nó không cho bạn kiểm soát việc render, cách thức địa lý, hay khối lượng — những thuộc tính mà một pipeline lấy dữ liệu được xây dựng dựa vào — đó là lý do tại sao các thiết lập sản xuất kết hợp Gemini với một lớp lấy dữ liệu riêng và truyền dữ liệu mẫu được làm sạch.

H: Mô hình Gemini nào tôi nên sử dụng cho việc trích xuất?

Mô hình tier flash nhỏ nhất mà giữ schema của bạn. Việc trích xuất dựa trên một schema nghiêm ngặt là một nhiệm vụ hạn chế, không phải tiêu chuẩn lý luận — lần chạy trực tiếp trong hướng dẫn này đã sử dụng một mô hình flash-lite và đã gõ chính xác tất cả 20 bản ghi. Chỉ chuyển lên một tier khi đầu vào sạch vẫn tạo ra các trường không đúng.

H: Chi phí sử dụng Gemini để lấy dữ liệu web là bao nhiêu khi quy mô lớn?

Các token đầu vào chiếm ưu thế, vì vậy chi phí ước tính là trang × token-mỗi-trang × tỷ lệ mô hình. Lần chạy đo lường ở đây là 12,904 token cho một trang 50,449 ký tự; cắt trang chrome hoặc lấy markdown sẽ giảm đáng kể. Đo lường một trang thực trước khi suy diễn — các trung bình phát minh là nguyên nhân khiến ngân sách bị chết.

H: Điều này khác gì so với trình lấy dữ liệu Gemini?

Hướng đi. Hướng dẫn này sử dụng Gemini như một trình phân tích hướng tới web. Một trình lấy dữ liệu Gemini chỉ định một trình lấy dữ liệu vào Gemini — capturing các câu trả lời, trích dẫn, và nguồn của nó như dữ liệu. Scrapeless cung cấp điều đó như một actor; hướng dẫn Gemini Scraper API được liên kết trong phần giới thiệu bao quát điều đó.

H: Lấy dữ liệu với Gemini có hợp pháp không?

Lớp trích xuất không thay đổi gì về quy tắc thu thập. Chỉ lấy các trang công khai, tôn trọng các điều khoản của trang web và các chỉ thị robot tiêu chuẩn hóa bởi the Robots Exclusion Protocol, giữ khối lượng trong giới hạn, và xử lý bất kỳ dữ liệu cá nhân một cách hợp pháp — cộng với các điều khoản API của Google ở bên mô hình.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục