🎯 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

Văn bản Web Sạch cho RAG: Một Quy Trình Lấy, Trích Xuất và Chia Nhỏ

Isabella Garcia
Isabella Garcia

Web Data Collection Specialist

10-Jun-2026

Những điểm chính:

  • Chất lượng RAG là chất lượng của tập hợp tài liệu. Các câu trả lời từ việc truy xuất chỉ tốt như văn bản mà bạn đã lập chỉ mục — và hầu hết các sự cố trong quy trình đều trở lại với các trang chưa bao giờ hiển thị, các điều hướng tích hợp, hoặc các đoạn bị chia cắt giữa ý nghĩ.
  • Lấy dữ liệu là giai đoạn không đáng tin cậy. Các trang hiện đại được render bằng JavaScript và kiểm tra bởi bot; một HTTP GET đơn giản trả về một shell trống hoặc một trang thách thức, và những thứ rác này âm thầm chảy vào kho vector của bạn.
  • Một POST trả về trang đã được render. Công cụ mở khóa web Scrapeless nhận một URL và trả lại HTML đã được render hoàn toàn dưới dạng {"code": 200, "data": "<html…>"} — việc render và xử lý chống bot đều diễn ra phía máy chủ.
  • Trích xuất là phép trừ. Bỏ các script, style, điều hướng và chân trang trước khi đọc văn bản; những gì còn lại là đoạn văn xứng đáng để nhúng.
  • Chia đoạn với sự chồng chéo, giữ nguồn gốc. Các cửa sổ từ cố định có sự chồng chéo bảo tồn ngữ cảnh qua các ranh giới, và mỗi đoạn nên mang theo URL nguồn của nó — việc truy xuất mà không có nguồn gốc không thể được kiểm tra.
  • Miễn phí để bắt đầu. Tài khoản Scrapeless mới bao gồm tín dụng dùng thử miễn phí — đăng ký tại app.scrapeless.com.

Quy trình tổng quan

Hệ thống RAG truy xuất các đoạn văn bản và cung cấp chúng cho một mô hình; mọi thứ phía dưới đều thừa hưởng những gì đã được đưa vào chỉ mục. Hướng dẫn này xây dựng toàn bộ phần tiếp nhận từ đầu đến cuối:

  1. Lấy dữ liệu — lấy HTML đã được render hoàn toàn cho danh sách URL thông qua công cụ mở khóa web, để các trang được xây dựng bằng JavaScript và các trang đã được kiểm tra bởi bot trả về nội dung thực.
  2. Trích xuất — loại bỏ phần điều hướng trang và giữ lại đoạn văn.
  3. Chia đoạn — chia thành các cửa sổ từ chồng chéo với nguồn gốc, sẵn sàng cho bất kỳ mô hình nhúng nào và kho vector.

Đầu ra là corpus.jsonl: một đoạn cho mỗi dòng với URL nguồn và vị trí của nó — định dạng trung tính mà mọi quy trình nhúng đều chấp nhận. Các giai đoạn 2 và 3 là các chuyển đổi thuần túy; chỉ có giai đoạn 1 mới chạm vào mạng.


Tại sao giai đoạn lấy dữ liệu bị hỏng đầu tiên

Ba cách thức gặp sự cố chi phối việc nhập văn bản web, và cả ba đều vô hình cho đến khi chất lượng truy xuất giảm:

  • Render phía client. HTML mà một GET đơn giản trả về là một shell tải; bài viết sẽ xuất hiện sau đó qua JavaScript. Công cụ trích xuất của bạn đọc một <div id="root"> trống và không lập chỉ mục được gì.
  • Trang liên kết chống bot. Các trang thách thức trả về HTTP 200 với đoạn văn "đang kiểm tra trình duyệt của bạn" — điều này nhúng rất đẹp và truy xuất tự tin.
  • Soft-404s. Các URL chết hiển thị một trang không tìm thấy có kiểu dáng, một lần nữa với trạng thái 200.

Giải pháp là lấy dữ liệu thông qua cơ sở hạ tầng có khả năng render và xóa các lớp đó ở phía máy chủ. Công cụ mở khóa web Universal Scraping API thực hiện chính xác điều đó: một POST cho mỗi URL, HTML đã được render quay lại.


Các yêu cầu tiên quyết

  • Tài khoản Scrapeless và khóa API — đăng ký tại app.scrapeless.com.
  • Python 3.10+ với requestsbeautifulsoup4.
  • Danh sách URL mà bạn có quyền nhập (xem chú thích nguồn bên dưới).
bash Copy
export SCRAPELESS_API_KEY=your_api_token_here

Giai đoạn 1 — Lấy các trang đã được render

Một POST cho mỗi URL đến endpoint mở khóa. Phản hồi là JSON với tài liệu đã được render trong data:

python Copy
# fetch.py — Danh sách URL -> pages/*.html (hoàn toàn đã được render)
import os
import pathlib

import requests

ENDPOINT = "https://api.scrapeless.com/api/v1/unlocker/request"
HEADERS = {
    "Content-Type": "application/json",
    "x-api-token": os.environ["SCRAPELESS_API_KEY"],
}

URLS = [
    "https://www.scrapeless.com/vi/blog/best-llm-scrapers-2026",
    "https://www.scrapeless.com/vi/blog/google-ai-overview-scraper-api-2026",
]

pathlib.Path("pages").mkdir(exist_ok=True)
for url in URLS:
    resp = requests.post(
        ENDPOINT,
        headers=HEADERS,
        json={
            "actor": "unlocker.webunlocker",
            "input": {"url": url, "type": "html", "redirect": True, "method": "GET"},
        },
        timeout=120,
    )
    resp.raise_for_status()
    html = resp.json()["data"]
    name = url.rstrip("/").rsplit("/", 1)[-1] + ".html"
    pathlib.Path("pages", name).write_text(html, encoding="utf-8")
    print(f"{url} -> pages/{name} ({len(html):,} bytes)")

Một lần lấy dữ liệu khỏe mạnh sẽ trả về hàng trăm kilobyte tài liệu đã được render cho mỗi trang bài viết. Một vài kilobyte thường có nghĩa là một shell hoặc một liên kết liên kết — đáng để kiểm tra trước khi nó tới chỉ mục.

Lấy khóa API của bạn trên gói miễn phí: app.scrapeless.com


Giai đoạn 2 và 3 — Trích xuất đoạn văn, chia đoạn với nguồn gốc

Trích xuất là phép trừ: loại bỏ các phần tử không bao giờ là văn xuôi, sau đó đọc văn bản từ những gì còn lại. Chia nhỏ là một cửa sổ từ cố định có sự chồng chéo, và mỗi phần giữ lại URL nguồn và vị trí của nó:

python Copy
# build_corpus.py — trang/*.html -> corpus.jsonl (các phần với nguồn gốc)
import json
import pathlib

from bs4 import BeautifulSoup

CHUNK_WORDS = 220      # kích thước cửa sổ
OVERLAP_WORDS = 40     # mang vào phần tiếp theo

STRIP_TAGS = ["script", "style", "noscript", "nav", "header", "footer", "aside", "form", "svg"]


def extract_text(html: str) -> str:
    soup = BeautifulSoup(html, "html.parser")
    for tag in soup(STRIP_TAGS):
        tag.decompose()
    root = soup.find("article") or soup.find("main") or soup.body or soup
    text = root.get_text(" ", strip=True)
    return " ".join(text.split())


def chunk(words: list[str]):
    step = CHUNK_WORDS - OVERLAP_WORDS
    for start in range(0, max(len(words) - OVERLAP_WORDS, 1), step):
        yield start, " ".join(words[start:start + CHUNK_WORDS])


total = 0
with open("corpus.jsonl", "w", encoding="utf-8") as out:
    for page in sorted(pathlib.Path("pages").glob("*.html")):
        text = extract_text(page.read_text(encoding="utf-8"))
        words = text.split()
        for start, body in chunk(words):
            out.write(json.dumps({
                "source": page.stem,
                "word_offset": start,
                "n_words": len(body.split()),
                "text": body,
            }) + "\n")
            total += 1
        print(f"{page.name}: {len(words):,} từ")

print(f"{total} phần -> corpus.jsonl")

Kết quả ra, một dòng cho mỗi phần:

json Copy
// mẫu minh họa — sơ đồ từ một lần chạy build_corpus.py trực tiếp; văn bản rút gọn
{
  "source": "best-llm-scrapers-2026",
  "word_offset": 180,
  "n_words": 220,
  "text": "…diễn viên trả lại câu trả lời cộng với các chứng cứ của nó dưới dạng các trường có cấu trúc…"
}

Từ đây, bất kỳ quy trình nhúng nào sẽ đảm nhiệm: đọc corpus.jsonl, nhúng text, lưu trữ vector với sourceword_offset dưới dạng siêu dữ liệu. Các trường nguồn gốc là những gì cho phép bạn truy tìm một truy xuất sai trở lại trang và vị trí mà nó đến.


Nguồn gốc một cách có trách nhiệm

Một tập hợp huấn luyện hoặc truy xuất thừa hưởng trọng lượng pháp lý từ nguồn của nó. Chỉ nhập vào các trang công khai mà bạn có quyền sử dụng; kiểm tra điều khoản dịch vụ và chỉ dẫn robots của từng trang trước khi thêm vào danh sách URL; giữ khối lượng yêu cầu ở mức khiêm tốn đối với mỗi máy chủ; và coi văn bản có bản quyền như là điều bạn lấy và ghi nhận chứ không phải tái xuất bản. Khi một tập hợp bao gồm nội dung của bên thứ ba, việc giữ nguyên trường source là sự khác biệt giữa một tài liệu tham khảo và một bản sao.


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

Q: Tại sao không chỉ sử dụng requests.get trên các URL?

Đối với các trang tĩnh thì nó hoạt động. Đối với các trang được render bằng JavaScript hoặc kiểm tra bởi bot, nó trả về các shell và màn hình tạm thời gây nhiễu chỉ số một cách lén lút — công cụ giải mã tồn tại chính xác cho những vấn đề đó.

Q: Các phần nên lớn bao nhiêu?

Cửa sổ 220/40 ở đây là một mặc định hợp lý cho các mô hình nhúng kiểu transformers câu. Điều chỉnh theo ngữ cảnh của mô hình của bạn và độ chính xác truy xuất; giữ một số chồng chéo để những ý tưởng mà vượt qua ranh giới vẫn được giữ lại.

Q: Làm thế nào tôi có thể phát hiện một lần truy xuất sai trước khi nó đến chỉ số?

Kiểm tra kích thước và nội dung: các trang bài viết được render thường lớn (các trang trong ví dụ có dung lượng hàng trăm kilobyte), và văn bản trích xuất dưới vài trăm từ từ một trang lẽ ra nên là một bài viết là một dấu hiệu cảnh báo đáng ghi nhận.

Q: Công cụ này có thể lấy được các trang ở phía sau các nhà cung cấp chống bot nặng không?

Công việc của công cụ giải mã là xóa các lớp chống bot phía máy chủ. Nơi một trang cụ thể vẫn không thể được lấy, hãy coi nó là không thể lấy được và bỏ qua — một trang bị thiếu là có thể phục hồi, nhưng chỉ số bị nhiễu thì không.

Q: Tôi có cần một proxy không?

Không. Việc xuất dữ liệu và render được xử lý bên trong công cụ diễn viên; POST bạn gửi là toàn bộ tích hợp.

Q: Khi nào thì các nhúng và lưu trữ vector xuất hiện?

Sau corpus.jsonl, với bất kỳ công nghệ nào bạn đã sử dụng. Quy trình này cố ý dừng lại ở các phần sạch sẽ, có nhãn nguồn gốc — định dạng mà mọi công cụ nhúng đều chấp nhận.


Kết luận: sạch từ đầu vào đến đầu ra

Quy trình nhập giảm xuống còn ba tệp ngắn: lấy HTML được render qua công cụ giải mã, trừ đi phần chrome, chia nhỏ với sự chồng chéo và nguồn gốc. Không phần nào là hấp dẫn, và tất cả đều quyết định liệu các câu trả lời truy xuất có đến từ văn bản bài viết thực sự hay từ một shell loader đã lọt vào chỉ số. Hướng danh sách URL vào các nguồn mà trợ lý của bạn nên biết, lập lịch chạy và giữ lại các trang thô — chúng là dấu vết kiểm toán.

Sẵn sàng để xây dựng quy trình nhập RAG của bạn?

Tham gia cộng đồng của chúng tôi để yêu cầu một kế hoạch miễn phí và kết nối với các nhà phát triển xây dựng các quy trình dữ liệu: Discord · Telegram.
Đăng ký tại app.scrapeless.com để nhận tín dụng dùng thử miễn phí, và chỉ định giai đoạn lấy dữ liệu đến các trang mà tập dữ liệu bạn cần. Xem bảng giá để biết các cấp độ hiện tại.

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