🎯 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

Hướng dẫn thực tế về thu thập dữ liệu web với ChatGPT

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

17-Jul-2026

TL;DR:

  • ChatGPT không truy cập trang web — nó phân tích văn bản bạn đưa ra. Mô hình không có trình duyệt, không có engine JavaScript và không có cách nào vượt qua thử thách truy cập, vì vậy mọi thiết lập "ChatGPT web scraping" hoạt động đều có hai lớp: một cái lấy trang và mô hình trích xuất các trường.
  • Lớp trích xuất thực sự tốt. Với đầu ra có cấu trúc của OpenAI Python SDK, bạn định nghĩa một sơ đồ Pydantic và chat.completions.parse trả về các đối tượng đã được xác thực — không cần bảo trì selector khi bố cục trang thay đổi.
  • Giới hạn là có thể đo lường. Một HTTP GET thông thường trên một trang demo được render bằng JavaScript trả về 0 phần tử trích dẫn; cùng một URL được lấy thông qua Scrapeless Universal Scraping API với js_render được bật trả về tất cả 10. Khoảng cách đó chính là điều mà mô hình không thể vượt qua một mình.
  • Thiết kế sơ đồ đánh bại sự thông minh trong prompt. Các trường có thể null, kiểu rõ ràng, và một trang cho mỗi cuộc gọi tạo ra các trích xuất mà bạn có thể tin tưởng; các prompt mơ hồ tạo ra những phát minh tự tin.
  • Biết công cụ bạn đang cầm. "ChatGPT web scraping" (hướng dẫn này — mô hình như bộ phân tích) là ngược lại với một trình thu thập dữ liệu ChatGPT, cái mà ghi lại câu trả lời chính của ChatGPT như dữ liệu.
  • Miễn phí để bắt đầu. Lớp lấy trong hướng dẫn này hoạt động trên gói miễn phí — tạo khóa API của bạn tại app.scrapeless.com.

ChatGPT có thể lấy dữ liệu website không?

Không phải tự thân nó. ChatGPT là một mô hình ngôn ngữ: nó đọc và sản xuất văn bản, và nó không thực hiện bất kỳ điều gì mà lớp lấy của một trình thu thập dữ liệu làm — phát hành yêu cầu, thực thi JavaScript, giữ phiên hoặc trả lời thách thức chống bot. Dán văn bản trang vào nó và nó trích xuất các trường rất ấn tượng; chỉ định URL cho nó và bạn đang phụ thuộc vào bất kỳ công cụ lấy nào bao bọc mô hình trong ngày hôm đó, điều này thất bại một cách im lặng trên các trang đã được render hoặc bảo vệ.

Vì vậy, kiến trúc thực tiễn của "ChatGPT web scraping" luôn có cùng hai lớp. Một lớp lấy thông tin lại bản sao chính xác của trang. Một lớp trích xuất — OpenAI API với một sơ đồ — biến bản sao đó thành các bản ghi có cấu trúc. Hướng dẫn này xây dựng lớp trích xuất trước, bởi vì đó là nơi ChatGPT kiếm vị trí của mình, sau đó cho thấy chế độ thất bại của lớp lấy và cách khắc phục với một ví dụ trực tiếp, có thể tái tạo.

Một sự phân biệt trước mã, bởi vì từ khóa này thực sự mơ hồ: hướng dẫn này sử dụng ChatGPT như bộ não của trình thu thập dữ liệu. Công việc ngược lại — ghi lại câu trả lời và tài liệu tham khảo của chính ChatGPT như dữ liệu — là một công cụ hoàn toàn khác, được bao phủ bởi hướng dẫn ChatGPT Scraper API và giải thích rộng hơn về LLM scraper.

Cài đặt

Hai gói bao phủ cả hai lớp — OpenAI SDK cho trích xuất và requests cho HTTP. Phiên bản ở đây là những phiên bản mà hướng dẫn này được viết dựa trên (openai 2.34.0):

bash Copy
pip install "openai==2.34.0" requests

Cấu hình

Cả hai lớp đều xác thực từ môi trường, vì vậy không có khóa nào sống trong mã nguồn:

bash Copy
export OPENAI_API_KEY="sk-your_openai_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

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

OpenAI SDK hiện tại thực hiện trích xuất có cấu trúc trong một cuộc gọi: định nghĩa bản ghi dưới dạng mô hình Pydantic, truyền nó dưới dạng response_format, và chat.completions.parse trả về các thể hiện của nó. Sơ đồ mang lại độ tin cậy. Mô hình bị ràng buộc bởi các tên và kiểu trường mà bạn đã khai báo — kiểu hợp đồng giống như chuẩn JSON Schema điều chỉnh — vì vậy chất lượng đầu ra không còn phụ thuộc vào việc bạn đã thuyết phục cẩn thận đến mức nào trong prompt.

Lưu ý: Khối này cần một OPENAI_API_KEY có tín dụng API — yêu cầu tiên quyết mà hướng dẫn này không giả định, vì vậy các cuộc gọi trích xuất được hiển thị mà không có đầu ra đã được ghi lại và hình dạng kết quả của chúng được mô tả dưới đây. Lớp lấy theo sau chạy thực tế chỉ với một khóa Scrapeless.

python Copy
# extract.py — ChatGPT như lớp trích xuất (cần OPENAI_API_KEY)
from openai import OpenAI
from pydantic import BaseModel


class Quote(BaseModel):
    text: str
    author: str
    tags: list[str]


class QuotePage(BaseModel):
    quotes: list[Quote]


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

completion = client.chat.completions.parse(
    model="gpt-4.1-mini-2025-04-14",
    messages=[
        {
            "role": "system",
            "content": "Trích xuất mọi câu trích dẫn từ trang. "
            "Sử dụng null cho bất cứ điều gì — bỏ qua một câu trích dẫn hoàn toàn thay vì tạo ra các trường.",
        },

{"vai trò": "người dùng", "nội dung": page_html},
],
định dạng_phản_hồi=QuotePage,
)

trang = hoàn thành.lựa_chọn[0].tin_nhắn.parsed
in(f"trích xuất {len(trang.câu_trích)} câu trích")

Trên một trang được phân tích, điều này trả về một QuotePage mà danh sách .quotes của nó giữ một Quote đã được xác thực cho mỗi bản ghi — các đối tượng Python kiểu, không phải chuỗi mà bạn vẫn phải json.loads và bảo vệ. Các tham số và quy tắc schema hiện tại nằm trong hướng dẫn đầu ra có cấu trúc của OpenAI.

Các mẫu nâng cao

Ba thói quen tách biệt một bộ thu thập dữ liệu đáng tin cậy khỏi một bản demo:

  • Biểu diễn sự vắng mặt. Nếu một trường có thể bị thiếu trên trang thực, hãy gán kiểu str | None và nói điều đó trong tin nhắn hệ thống. Một schema chỉ với các chuỗi bắt buộc buộc mô hình phải lấp đầy khoảng trống, và nó sẽ.
  • Cung cấp cho mô hình ít trang hơn. Mã HTML tốn token và mời gọi sự phân tâm. Nếu bạn có thể tách rời nội dung — hoặc lấy trang dưới dạng markdown thay vì HTML — việc trích xuất sẽ tiết kiệm hơn và chính xác hơn cùng một lúc.
  • Giữ một trang mỗi cuộc gọi. Gộp mười trang vào một prompt tiết kiệm yêu cầu và làm giảm độ chính xác: các bản ghi chảy qua các ranh giới trang. Vòng lặp thuộc về Python, không phải trong prompt.

Cũng có một cách sử dụng thứ hai, cũ hơn để dùng ChatGPT cho việc thu thập dữ liệu: yêu cầu nó viết một kịch bản dựa trên lựa chọn cho bạn, sau đó chạy kịch bản đó trên mỗi trang. Đây vẫn là lựa chọn đúng cho công việc khối lượng lớn trên một bố cục ổn định — mã được tạo sẽ chạy miễn phí sau trang đầu tiên — nhưng bạn sẽ xem xét nó như bất kỳ mã nào bạn không viết, và nó thừa kế mọi giới hạn của lớp lấy dữ liệu trong phần sau.

Giới hạn trung thực: ChatGPT không thể lấy trang

Mọi điều trên đều giả định rằng page.html tồn tại và trung thực. Giả định đó là nơi mà việc thu thập dữ liệu chỉ bằng ChatGPT bị gãy, và sự gãy này có thể tái hiện. Một yêu cầu HTTP GET thông thường trả về các byte mà máy chủ gửi — theo tiêu chuẩn ngữ nghĩa HTTP, một đại diện của tài nguyên, không phải trang mà trình duyệt sẽ xây dựng từ đó. Trên một trang được kết xuất bằng JavaScript, đó là những tài liệu rất khác nhau:

python Copy
# plain_fetch.py — những gì một GET thông thường thực sự thấy trên một trang được kết xuất bằng JS
import requests

url = "https://quotes.toscrape.com/js/"
resp = requests.get(url, timeout=60)
html = resp.text
print(f"trạng thái {resp.status_code} | {len(html):,} ký tự")
print("các phần tử câu trích trong HTML:", html.count('<span class="text"'))

Lượt chạy in ra trạng thái 200 — một yêu cầu hoàn toàn thành công — và 0 phần tử câu trích, vì trên trang demo này, các câu trích chỉ tồn tại bên trong một biến kịch bản cho đến khi một động cơ JavaScript xây dựng DOM. Đưa HTML này vào bộ thu thập dữ liệu ở trên và mô hình tốt nhất có thể trích xuất được gì, hoặc tệ hơn, đoán.

Giải pháp là kết xuất trước khi bạn trích xuất. API thu thập dữ liệu toàn cầu nhận cùng một URL trong một POST, thực thi trang ở phía máy chủ với js_render được bật, và trả về DOM mà một người đọc sẽ thấy — bao gồm mở khóa và định tuyến proxy, không cần chạy cục bộ:

python Copy
# rendered_fetch.py — cùng một URL, được kết xuất ở phía máy chủ trước khi trích xuất
import os

import requests

resp = requests.post(
    "https://api.scrapeless.com/api/v1/unlocker/request",
    headers={
        "Nội dung-Loại": "application/json",
        "x-api-token": os.environ["SCRAPELESS_API_KEY"],
    },
    json={
        "diễn viên": "unlocker.webunlocker",
        "đầu vào": {"url": "https://quotes.toscrape.com/js/", "phương thức": "GET", "js_render": True},
    },
    timeout=120,
)
resp.raise_for_status()
html = resp.json().get("dữ liệu", "")
print(f"trang đã được kết xuất: {len(html):,} ký tự")
print("các phần tử câu trích trong HTML:", html.count('<span class="text"'))

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

Cùng một URL, và lượt chạy in ra 10 phần tử câu trích trong 8,940 ký tự HTML đã được kết xuất — tệp mà lớp trích xuất cần tất cả mọi lúc. Hai lượt in song song là toàn bộ lập luận: 0 phần tử câu trích trong lần lấy thông thường, 10 trong lần kết xuất. Nối hai kịch bản lại với nhau và bạn có mô hình hoạt động: kết xuất qua Scrapeless, trích xuất với ChatGPT.

Lấy khóa API của bạn trên kế hoạch miễn phí: app.scrapeless.com

Khắc phục sự cố

  • Mô hình trả về văn xuôi thay vì JSON. Bạn đang ở trên lệnh gọi create thông thường — chuyển sang chat.completions.parse với một mô hình response_format, điều này hạn chế đầu ra ở cấp API thay vì yêu cầu một cách lịch sự.
  • Các trường tự động điền nhưng lẽ ra phải trống. Làm cho trường đó tùy chọn trong sơ đồ và nêu rõ quy tắc null trong thông điệp hệ thống. Sự thất bại nằm ở hợp đồng, không phải tâm trạng của mô hình.
  • Việc trích xuất đúng ở một số trang, nhưng trống rỗng ở trang khác. So sánh những gì bạn thực sự đã thu thập, không phải những gì trình duyệt hiển thị cho bạn - đếm một phần tử đã biết trong HTML đã thu thập theo cách mà script plain-fetch làm. Không có kết quả nào có nghĩa là có vấn đề về hiển thị hoặc truy cập, và bạn sửa nó ở lớp thu thập (js_render, hoặc một quốc gia xuất khẩu khác) thay vì trong prompt.
  • Chi phí token tăng theo khối lượng. Cắt trang đến phần chứa nội dung trước khi gọi, hoặc trích xuất từ markdown thay vì HTML thô. Đối với các bố cục ổn định, có khối lượng lớn, hãy để mô hình viết một script chọn lựa một lần và chỉ tốn token khi bố cục thay đổi.

Kết luận

ChatGPT đã thay đổi nửa nào của việc thu thập dữ liệu trở nên khó khăn. Trích xuất - phần mà trước đây có nghĩa là các bộ chọn dễ bị hỏng - giờ đây là một sơ đồ và một cuộc gọi SDK. Thu thập - phần mà mô hình không thể thực hiện - vẫn quyết định xem có điều gì thực sự để trích xuất hay không, và minh họa 0 so với 10 ở trên là cách mà ranh giới đó xuất hiện trong thực tế. Xây dựng hai lớp một cách tách biệt, xác minh quá trình thu thập trước khi bạn trả tiền cho việc trích xuất, và sự kết hợp này sẽ tạo ra một công cụ thu thập dữ liệu có thể tồn tại qua việc tái thiết kế.

Sẵn sàng để cung cấp cho công cụ trích xuất của bạn các trang thực tế?

Lớp thu thập trong hướng dẫn này là một POST cho mỗi trang trên Universal Scraping API - các kế hoạch và khối lượng yêu cầu có trên trang giá, và tài liệu phát triển bao phủ mọi tham số mà unlocker.webunlocker chấp nhận. Tạo một khóa trên kế hoạch miễn phí tại app.scrapeless.com và tự chạy lại hai script thu thập.

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

Q: ChatGPT có thể thu thập dữ liệu từ các trang web trực tiếp không?

Không. Mô hình không thể phát đi các yêu cầu HTTP, thực thi JavaScript, hoặc vượt qua các bài kiểm tra chống bot - nó trích xuất từ văn bản mà một cái gì đó khác đã thu thập. Các sản phẩm trò chuyện dành cho người tiêu dùng đôi khi bao bọc mô hình bằng một công cụ duyệt web, nhưng công cụ đó quy mô nhỏ và bị nhiều trang web chặn, đó là lý do tại sao các thiết lập sản xuất ghép mô hình với một lớp thu thập dữ liệu riêng.

Q: Việc thu thập dữ liệu bằng ChatGPT có hợp pháp không?

Lớp trích xuất không thay đổi các quy tắc của lớp thu thập dữ liệu. Chỉ thu thập 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 được xác định bởi Giao thức loại trừ Robot, giữ khối lượng giới hạn và đối xử với bất kỳ dữ liệu cá nhân nào theo các luật về quyền riêng tư áp dụng cho bạn - cùng những nghĩa vụ như với bất kỳ công cụ thu thập nào, cộng với các điều khoản sử dụng của nhà cung cấp mô hình của bạn.

Q: Khi nào một công cụ thu thập dữ liệu bằng bộ chọn truyền thống vẫn là lựa chọn tốt hơn?

Khi có khối lượng lớn trên các bố cục ổn định. Một cuộc gọi LLM tiêu tốn token cho mỗi trang; một script chọn lựa không tốn gì sau khi được viết. Phân chia thực tiễn: sử dụng mô hình ở những nơi bố cục khác nhau hoặc thay đổi thường xuyên, và mã chọn lựa được tạo ra sau đó xem xét ở nơi mà một bố cục lặp lại hàng nghìn lần.

Q: Điều này khác gì so với một "công cụ thu thập dữ liệu ChatGPT"?

Hướng đi. Hướng dẫn này chỉ định mô hình đến web - ChatGPT là bộ phân tích cú pháp. Một công cụ thu thập dữ liệu ChatGPT chỉ định một công cụ thu thập dữ liệu đến ChatGPT - nó ghi lại các câu trả lời, dẫn chứng và kết quả sản phẩm của trợ lý dưới dạng dữ liệu có cấu trúc. Scrapeless cung cấp điều đó như một tác nhân; hướng dẫn API thu thập dữ liệu ChatGPT liên kết trong phần giới thiệu đã đề cập đến vấn đề này.

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

Bắt đầu với một mô hình nhỏ, hiện tại và chỉ nâng cấp nếu chất lượng trích xuất yêu cầu. Các đầu ra có cấu trúc hạn chế hình dạng phản hồi bất kể kích thước mô hình, vì vậy các cấp nhỏ hơn xử lý tốt các sơ đồ xác định trên đầu vào sạch - hãy chi tiêu tiết kiệm cho việc thu thập thêm các trang khác.

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