Trong thế giới số hóa ngày nay, việc thu thập dữ liệu từ các trang web (web scraping) đã phát triển vượt xa khỏi những phương pháp phân tích HTML đơn giản. Các website hiện đại thường rất động, sử dụng nhiều JavaScript và được bảo vệ bởi các cơ chế chống bot phức tạp, khiến các công cụ truyền thống như requests và BeautifulSoup trở nên kém hiệu quả. Sự phức tạp ngày càng tăng này đã thúc đẩy các nhà phát triển tìm kiếm những phương pháp thông minh hơn để trích xuất dữ liệu một cách hiệu quả.
Đây chính là lúc Perplexity AI phát huy vai trò của mình. Thay vì phải viết hàng chục quy tắc phân tích cú pháp dễ bị lỗi, giờ đây các nhà phát triển có thể sử dụng Perplexity để diễn giải HTML thô hoặc văn bản thông qua các câu lệnh ngôn ngữ tự nhiên và nhận lại dữ liệu có cấu trúc. Hướng dẫn chuyên sâu này sẽ khám phá cách Perplexity AI có thể tích hợp vào quy trình web scraping, so sánh nó với các phương pháp truyền thống, và trình diễn cách trích xuất dữ liệu bằng AI thông qua một đoạn mã Python đơn giản. Chúng ta cũng sẽ thảo luận khi nào cần mở rộng quy mô với các giải pháp như Oxylabs Web Scraper API cho các trường hợp sử dụng phức tạp, được bảo vệ hoặc quy mô lớn hơn.
Hãy cùng tìm hiểu sâu hơn!
Mục lục
Perplexity AI là gì và tại sao nó lại quan trọng với Web Scraping?
Perplexity AI là một công cụ nghiên cứu và lập luận mạnh mẽ dựa trên Mô hình Ngôn ngữ Lớn (LLM), được thiết kế để trả lời các câu hỏi phức tạp, tóm tắt nội dung và diễn giải thông tin với độ chính xác và ngữ cảnh cao. Không giống như công cụ tìm kiếm thông thường, Perplexity kết hợp khả năng hiểu ngôn ngữ tự nhiên với việc truy cập dữ liệu web theo thời gian thực, cho phép nó xử lý các đoạn văn bản dài, diễn giải ý nghĩa và tạo ra các bản tóm tắt ngắn gọn, có cấu trúc dễ dàng sử dụng.
Đối với các nhà phát triển, Perplexity mang lại nhiều hơn là chỉ khả năng trò chuyện – nó có thể hoạt động như một bộ phân tích cú pháp hậu scraping mạnh mẽ hơn. Thay vì phải tự mình xem xét HTML hoặc xử lý các cấu trúc DOM phức tạp, bạn có thể cấp cho Perplexity văn bản thô từ một trang web và hướng dẫn nó trích xuất chỉ các yếu tố liên quan, chẳng hạn như tên sản phẩm, chi tiết giá cả hoặc thông tin liên hệ.
Cách tiếp cận “không cần bộ chọn” này làm cho web scraping bằng AI trở thành một công cụ linh hoạt hơn để biến dữ liệu web thô, phi cấu trúc thành các đầu ra sạch, có cấu trúc có thể sử dụng trực tiếp trong cơ sở dữ liệu hoặc hệ thống phân tích.
Thay vì đọc HTML như một cấu trúc cố định đầy các thẻ, Perplexity xem nó theo cách con người làm – như ngôn ngữ. Điều này giúp các nhà phát triển đơn giản hóa quy trình scraping của họ dễ dàng hơn, đặc biệt khi xử lý các trang web sử dụng JavaScript hoặc có bố cục thường xuyên thay đổi.
Nói tóm lại, Perplexity AI tự nó không phải là một công cụ scraping. Nó hoạt động như một lớp thông minh giúp bạn hiểu dữ liệu mà bạn đã scrape. Nó có thể biến HTML lộn xộn, không có tổ chức thành thông tin sạch, có cấu trúc sẵn sàng để lưu trữ, phân tích hoặc sử dụng trong các ứng dụng khác.
Giờ đây chúng ta đã hiểu cách Perplexity diễn giải nội dung web, hãy cùng xem nó có thể mang lại lợi thế nào so với các phương pháp web scraping truyền thống.
Web Scraping Truyền Thống so với Web Scraping AI trong Python
Theo truyền thống, các nhà phát triển sử dụng kết hợp thư viện yêu cầu HTTP và thư viện phân tích cú pháp dữ liệu. Các thư viện yêu cầu HTTP, chẳng hạn như requests, được sử dụng để lấy HTML thô từ trang đích. Các thư viện như BeautifulSoup và các framework như Scrapy cho phép trích xuất và phân tích cú pháp nội dung HTML thô hiệu quả bằng cách cung cấp quyền truy cập và điều hướng có cấu trúc thông qua Document Object Model (DOM).
Để minh họa quy trình truyền thống, phụ thuộc vào bộ chọn này, đây là tóm tắt các bước cần thiết để trích xuất dữ liệu bằng các thư viện như requests và BeautifulSoup.

Cách tiếp cận này hoạt động tốt cho các trang tĩnh, nhưng nó thường bị lỗi khi các yếu tố thay đổi, khi các trang sử dụng JavaScript hoặc khi bố cục hơi khác nhau giữa các phần. Chúng ta có thể xem một ví dụ mã của web scraping truyền thống.
# pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
# Bước 1: Lấy trang web
url = "https://sandbox.oxylabs.io/products"
response = requests.get(url)
# Bước 2: Phân tích HTML bằng BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
# Bước 3: Trích xuất tiêu đề sản phẩm bằng bộ chọn CSS
titles = [item.text for item in soup.select(".title")]
print(titles)
Mặt khác, một quy trình làm việc có hỗ trợ AI sẽ thêm một lớp lập luận vào quy trình. Bạn vẫn sử dụng requests (hoặc trình duyệt headless) để lấy HTML thô, nhưng thay vì phân tích cú pháp thủ công, bạn cấp nội dung đó cho Perplexity AI và mô tả dữ liệu bạn cần bằng ngôn ngữ tự nhiên.
Mô hình diễn giải văn bản và trả về kết quả có cấu trúc – không cần bộ chọn CSS dễ bị lỗi hoặc duyệt XPath. Mặc dù cách tiếp cận truyền thống hoạt động với HTML tĩnh, nhưng nó lại gặp khó khăn với các bố cục sử dụng nhiều JavaScript hoặc thay đổi thường xuyên.
Trong minh họa sau, một câu lệnh ngôn ngữ tự nhiên đơn giản cho Perplexity AI thay thế việc điều hướng DOM dễ bị lỗi, biến HTML thô thành dữ liệu có cấu trúc.

Mã sau đây mô phỏng cách Web scraping hỗ trợ AI của Perplexity hoạt động trong Python.
Lưu ý: Đây chỉ là mã khung mẫu để phác thảo các bước liên quan đến web scraping AI; việc triển khai thực tế với tích hợp API thực tế sẽ được trình bày trong phần tiếp theo.
# Sử dụng cùng nội dung HTML đã lấy trước đó
html_content = response.text
# Bước 1: Tạo một câu lệnh ngôn ngữ tự nhiên cho Perplexity
prompt = f"""
Bạn là một công cụ trích xuất dữ liệu có cấu trúc. Từ HTML này, hãy trích xuất tất cả các sản phẩm được liệt kê trên trang.
Đối với mỗi sản phẩm, trả về JSON với:
- name
- category
- price (nếu có)
HTML:
\"\"\"{html_content[:2000]}\"\"\"
"""
# Bước 2: Định nghĩa một lệnh gọi Perplexity mô phỏng
def call_perplexity(prompt_text: str) -> str:
# Phản hồi AI mô phỏng cho một cửa hàng trò chơi
simulated_json_response = '''
{
"products": [
{"name": "Speed Racer Game", "category": "Racing", "price": "$29.99"},
{"name": "Puzzle Quest", "category": "Puzzle", "price": "$19.99"},
{"name": "Adventure Island", "category": "Adventure", "price": "$24.99"}
]
}
'''
return simulated_json_response
# Bước 3: Gửi prompt và phân tích kết quả có cấu trúc
import json
result = call_perplexity(prompt)
data = json.loads(result)
for product in data["products"]:
print(product["name"], "-", product["category"], "-", product["price"])
Quy trình này bao gồm các bước sau:
- Thu thập nội dung HTML của trang bằng
requestsvà lưu trữ nó tronghtml_content. - Tạo một câu lệnh ngôn ngữ tự nhiên yêu cầu Perplexity trích xuất tất cả chi tiết sản phẩm (tên, danh mục, giá) từ HTML.
- Định nghĩa một hàm
call_perplexity()mô phỏng việc gửi câu lệnh đến Perplexity và trả về phản hồi JSON có cấu trúc. - Sử dụng
json.loads()để chuyển đổi chuỗi JSON thành từ điển Python. - Lặp qua các sản phẩm trong từ điển và in tên, danh mục và giá của chúng.
Cách tiếp cận này cho phép trích xuất dữ liệu có cấu trúc mà không cần điều hướng HTML thủ công hoặc viết các bộ chọn dễ hỏng.
Vì chúng ta có thể dựa vào Perplexity AI để trả về kết quả yêu cầu ở định dạng mong muốn, chúng ta không còn cần phải cung cấp bất kỳ bộ chọn CSS nào cho các trường quan tâm trong nội dung HTML. Đó là điều tạo nên sự khác biệt; ngay cả khi các bộ chọn trường thay đổi với các bản cập nhật trang web, quy trình Perplexity web scraping có thể thích ứng một cách thông minh với chúng. Điều thú vị nhất là chúng ta không cần thực hiện bất kỳ thay đổi nào đối với truy vấn ban đầu của mình.
Nói cách khác, điều này làm cho web scraping AI trong Python linh hoạt hơn nhiều. Bạn có thể bỏ qua hoàn toàn việc duyệt DOM, xử lý các biến thể bố cục một cách duyên dáng và tập trung hơn vào việc cần trích xuất gì thay vì cách trích xuất.
Chúng ta đã thấy cách scraping có hỗ trợ AI thay đổi quy trình làm việc về mặt khái niệm. Dưới đây là bảng tổng hợp các điểm khác biệt chính giữa quy trình web scraping truyền thống và AI:


Và đây là hình ảnh minh họa về những điểm khác biệt chính:

Bây giờ, hãy cùng tổng hợp mọi thứ lại trong một bản demo thực tế từng bước, sử dụng API Perplexity thực sự trong Python.
Hướng Dẫn Chi Tiết: Sử Dụng Perplexity AI để Web Scraping
Giả sử mục tiêu của chúng ta cho Perplexity web scraping là trang web Oxylabs Scraping Sandbox – một trang demo liệt kê các sản phẩm khác nhau với tên, giá và các chi tiết khác.
Đây là giao diện của danh sách sản phẩm thuộc danh mục trò chơi điện tử trên trang web này:

Thông thường, việc scraping một trang như vậy đòi hỏi phải nhắm mục tiêu cẩn thận vào các phần tử HTML, xử lý các lớp CSS khác nhau và quản lý cấu trúc trang có thể thay đổi theo thời gian.
Nhưng với Perplexity AI, mọi thứ trở nên đơn giản hơn nhiều. Thay vì phân tích cú pháp HTML thủ công, bạn có thể cấp cho nó nội dung trang thô và chỉ cần yêu cầu nó trích xuất dữ liệu có cấu trúc, chẳng hạn như tất cả tên sản phẩm, danh mục và giá cả. AI sau đó sẽ trả về một phản hồi JSON được định dạng gọn gàng, giúp bạn thoát khỏi rắc rối của logic phân tích cú pháp truyền thống.
Bước 1 – Cài đặt và thiết lập các thư viện cần thiết
Đảm bảo bạn đã cài đặt Python 3.8+ trên hệ thống cùng với các thư viện sau:
pip install perplexityai requests beautifulsoup4
- Gói
requestscho phép lấy nội dung HTML thô từ trang đích. - Thư viện
BeautifulSoupgiúp phân tích cú pháp và làm sạch nội dung. - Thư viện
perplexityai, như tên gọi, cho phép giao tiếp với Perplexity API.
Bước 2 – Thêm khóa API Perplexity của bạn
Để xác thực các yêu cầu, bạn phải có khóa API Perplexity. Bạn chưa có? Hãy làm theo các bước sau để tạo một khóa:
- Đăng nhập vào tài khoản Perplexity của bạn.
- Truy cập phần Developer hoặc API trong bảng điều khiển.
- Nhấp vào “Create New API Key” (Tạo khóa API mới).
- Đặt tên hoặc nhãn cho khóa của bạn để dễ tham chiếu (ví dụ: “Dự án Web Scraper”).
- Sao chép khóa đã tạo và giữ an toàn – đây là thứ mã của bạn sẽ sử dụng để xác thực các yêu cầu.
- Đối với các dự án sản xuất, hãy cân nhắc xoay vòng hoặc lưu trữ khóa một cách an toàn thay vì mã hóa cứng trong các tập lệnh.
Lưu ý: Bạn cũng có thể làm theo hướng dẫn bắt đầu nhanh này để tạo và tìm hiểu những kiến thức cơ bản về Perplexity AI API.
Sau khi có khóa API, bạn có thể truyền nó vào mã của mình để khởi tạo client Perplexity và bắt đầu thực hiện các yêu cầu. Đối với ví dụ này, chúng ta sẽ đưa nó trực tiếp vào mã để đơn giản (⚠️ không khuyến nghị cho sản xuất):
API_KEY = "pplx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
💡 Trong các dự án thực tế, luôn lưu trữ khóa API của bạn trong các biến môi trường để bảo mật.
Bước 3 – Thu thập nội dung trang web đích
Hãy lấy nội dung trang mà chúng ta muốn trích xuất dữ liệu từ đó – trong trường hợp này là một trang liệt kê sản phẩm mẫu.
url = "https://sandbox.oxylabs.io/products"
resp = requests.get(url, timeout=30)
resp.raise_for_status()
html_content = resp.text
Đoạn mã này gửi một yêu cầu HTTP GET và truy xuất nội dung HTML. Sau khi có nội dung trang, bước tiếp theo là làm sạch nó để mô hình dễ đọc hơn.
Bước 4 – Làm sạch và chuẩn bị văn bản
soup = BeautifulSoup(html_content, "html.parser")
for script in soup(["script", "style"]):
script.decompose()
clean_text = soup.get_text(separator="\n", strip=True)
# Cắt văn bản đến độ dài an toàn cho đầu vào mô hình (điều chỉnh nếu cần)
INPUT_SNIPPET = clean_text[:4000]
Bước 5 – Khởi tạo client Perplexity
Bây giờ chúng ta thiết lập Perplexity SDK bằng khóa API của bạn.
from perplexity import Perplexity
client = Perplexity(api_key=API_KEY)
Bước 6 – Định nghĩa Prompt và Schema trích xuất
Từ danh sách các trò chơi điện tử, chúng ta cần scrape tiêu đề, danh mục và giá của chúng. Ảnh chụp màn hình sau đây cho thấy vị trí của các phần tử chúng ta cần trích xuất.

Chúng ta sẽ hướng dẫn mô hình, bằng tiếng Anh đơn giản, trích xuất dữ liệu sản phẩm có cấu trúc và trả về phản hồi JSON một cách nghiêm ngặt.
Chúng ta cũng định nghĩa một JSON schema để đảm bảo mô hình luôn tạo ra một cấu trúc có thể dự đoán được:
messages = [
{
"role": "system",
"content": "Bạn là một công cụ trích xuất dữ liệu có cấu trúc. Chỉ trả về JSON hợp lệ khớp với schema được cung cấp."
},
{
"role": "user",
"content": (
"Trích xuất tất cả các mục sản phẩm từ văn bản trang sau. "
"Đối với mỗi sản phẩm, trả về 'name', 'category', và 'price'. "
"Nếu một trường không có, hãy sử dụng chuỗi rỗng. "
"Chỉ trả về JSON khớp với schema."
f"\n\nPage text:\n\n{INPUT_SNIPPET}"
)
}
]
response_format = {
"type": "json_schema",
"json_schema": {
"schema": {
"type": "object",
"properties": {
"products": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"category": {"type": "string"},
"price": {"type": "string"}
},
"required": ["name", "category", "price"]
}
}
},
"required": ["products"]
}
}
}
role: "system"- Điều này đặt hành vi hoặc ngữ cảnh cho AI.
- Trong ví dụ của bạn, nó nói với mô hình: “Bạn là một công cụ trích xuất dữ liệu có cấu trúc. Chỉ trả về JSON hợp lệ khớp với schema được cung cấp.”
- Hãy coi đó là việc cung cấp hướng dẫn hoặc “tính cách” cho AI trước khi nó thấy bất kỳ đầu vào người dùng nào.
role: "user"- Đây là yêu cầu thực tế từ bạn – những gì bạn muốn AI thực hiện.
- Ở đây, nó chứa câu lệnh với HTML/văn bản và chỉ định dữ liệu bạn muốn trích xuất (tên, danh mục, giá).
- Về cơ bản là nói: “Đây là nội dung trang, vui lòng trích xuất dữ liệu theo định dạng tôi yêu cầu.”
Tại sao cần cả hai:
- Vai trò
systemđảm bảo AI biết các quy tắc (ví dụ: trả về JSON, tuân thủ schema). - Vai trò
usercung cấp đầu vào cụ thể cho tác vụ (văn bản trang, hướng dẫn).
Sử dụng cả hai cùng nhau giúp AI tạo ra đầu ra có cấu trúc và có thể dự đoán được, đặc biệt đối với các tác vụ như web scraping, nơi định dạng rất quan trọng. Với câu lệnh và schema đã sẵn sàng, đã đến lúc gửi yêu cầu đến Perplexity.
Bước 7 – Gửi yêu cầu đến Perplexity
Tại thời điểm này, bạn gửi yêu cầu đến điểm cuối chat completions của Perplexity. Bạn sẽ chỉ định:
- Mô hình nào sẽ sử dụng (ví dụ: “sonar” hoặc “sonar-pro”).
- Các thông báo chứa câu lệnh của bạn.
response_formatđể thực thi JSON schema.- Giới hạn cho
max_tokens.
Đây là lệnh gọi trong mã:
completion = client.chat.completions.create(
messages=messages,
model="sonar", # hoặc "sonar-pro" nếu gói của bạn hỗ trợ
response_format=response_format,
max_tokens=1500
)
Trước khi chúng ta chuyển sang phân tích kết quả, hãy cùng hiểu mô hình Perplexity nào phù hợp nhất cho tác vụ này và tại sao.
Chọn mô hình nào và tại sao?
- Chúng ta đã sử dụng
sonarhoặcsonar-provì Perplexity đã xây dựng chúng để trích xuất dữ liệu chính xác và hiểu nội dung web. - Các mô hình này bám sát văn bản gốc hơn, giảm thiểu hiện tượng “ảo giác” (hallucinations).
sonar-procung cấp khả năng lập luận và độ chính xác tốt hơn nhưng có thể tốn kém hơn hoặc yêu cầu gói cao cấp hơn.
Cũng như hầu hết các API AI, lựa chọn mô hình cũng ảnh hưởng đến chi phí – vì vậy điều quan trọng là phải hiểu cách Perplexity tính giá.
Về giá cả
- Perplexity tính phí thường dựa trên số token tiêu thụ (token đầu vào + token đầu ra).
- Các mô hình như Sonar-Pro thường phát sinh chi phí cao hơn trên mỗi token so với mô hình Sonar cơ bản, do độ chính xác được nâng cao và yêu cầu tính toán tăng lên.
- Vì việc trích xuất có cấu trúc thường liên quan đến đầu vào dài (đoạn HTML) và đầu ra dài (JSON chi tiết), chi phí có thể tăng lên.
- Để giảm thiểu chi phí, bạn có thể:
- Cắt bớt đầu vào (
INPUT_SNIPPET) chỉ còn các phần liên quan. - Giới hạn
max_tokensở mức thực sự cần thiết. - Sử dụng mô hình
sonarnhẹ hơn khi độ chính xác cao không quá quan trọng. - Lập hồ sơ và giám sát việc sử dụng token trong các lần chạy mẫu.
- Cắt bớt đầu vào (
Bước 8 – Phân tích cú pháp và xử lý phản hồi JSON có cấu trúc
Chúng ta sẽ phân tích cú pháp đầu ra JSON của AI một cách an toàn, cho dù nó được trả về dưới dạng một từ điển (dict) hay dưới dạng chuỗi JSON thô.
import json
import re
import sys
raw_content = completion.choices[0].message.content
# SDK có thể trả về dict hoặc chuỗi JSON. Xử lý cả hai trường hợp:
if isinstance(raw_content, str):
try:
parsed = json.loads(raw_content)
except json.JSONDecodeError:
# Thử tìm một chuỗi con JSON
m = re.search(r"(\{[\s\S]*\})", raw_content)
if m:
parsed = json.loads(m.group(1))
else:
print("Failed to parse JSON from model response.")
print("Raw response:", raw_content)
sys.exit(1)
else:
# Đã là cấu trúc giống dict
parsed = raw_content
products_data = parsed.get("products", [])
Phần mã này trích xuất và phân tích cú pháp phản hồi của mô hình một cách an toàn:
raw_contentlấy văn bản được trả về bởi mô hình.- Nó kiểm tra xem phản hồi có phải là một chuỗi hay không – nếu có, nó cố gắng chuyển đổi nó thành JSON bằng cách sử dụng
json.loads(). - Nếu thất bại, nó sử dụng một biểu thức chính quy để tìm và trích xuất một phần giống JSON từ văn bản.
- Nếu việc phân tích cú pháp vẫn thất bại, nó sẽ in ra một lỗi và dừng chương trình.
- Nếu phản hồi đã là một từ điển, nó sẽ bỏ qua việc phân tích cú pháp.
- Cuối cùng, nó trích xuất danh sách
productstừ JSON đã phân tích cú pháp.
Bước 9 – Hiển thị và xuất kết quả
Cuối cùng, chúng ta sẽ in dữ liệu sản phẩm đã trích xuất và lưu nó dưới dạng tệp CSV để sử dụng sau này.
import csv
for p in products_data:
print(p.get("name", ""), "-", p.get("category", ""), "-", p.get("price", ""))
# Lưu vào CSV (nếu tìm thấy sản phẩm)
if products_data:
with open("products.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["name", "category", "price"])
writer.writeheader()
writer.writerows(products_data)
print(f"Saved {len(products_data)} products to products.csv")
else:
print("No products found in the model output.")
Mã nguồn hoàn chỉnh
Dưới đây là tập lệnh hoạt động đầy đủ kết hợp mọi thứ ở trên:
from bs4 import BeautifulSoup
from perplexity import Perplexity
import requests
import csv
import json
import sys
# ---------------------------
# CẢNH BÁO: Khóa API trong tệp chỉ dành cho demo.
# Xoay vòng/bảo mật nó cho sử dụng sản xuất.
# ---------------------------
API_KEY = "pplx-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # Thay thế bằng khóa API thực của bạn
# Bước 1: Thu thập trang
url = "https://sandbox.oxylabs.io/products"
try:
resp = requests.get(url, timeout=30)
resp.raise_for_status()
html_content = resp.text
except requests.exceptions.RequestException as e:
print(f"Lỗi khi thu thập trang: {e}")
sys.exit(1)
# Bước 2: Làm sạch nội dung
soup = BeautifulSoup(html_content, "html.parser")
for script in soup(["script", "style"]):
script.decompose()
clean_text = soup.get_text(separator="\n", strip=True)
# Cắt văn bản đến độ dài an toàn cho đầu vào mô hình (điều chỉnh nếu cần)
INPUT_SNIPPET = clean_text[:4000]
# Bước 3: Khởi tạo client Perplexity (sử dụng API_KEY được cung cấp)
client = Perplexity(api_key=API_KEY)
# Bước 4: Chuẩn bị thông báo và định dạng phản hồi json_schema
messages = [
{
"role": "system",
"content": "Bạn là một công cụ trích xuất dữ liệu có cấu trúc. Chỉ trả về JSON hợp lệ khớp với schema được cung cấp."
},
{
"role": "user",
"content": (
"Trích xuất tất cả các mục sản phẩm từ văn bản trang sau. "
"Đối với mỗi sản phẩm, trả về 'name', 'category', và 'price'. "
"Nếu một trường không có, hãy sử dụng chuỗi rỗng. "
"Chỉ trả về JSON khớp với schema."
f"\n\nPage text:\n\n{INPUT_SNIPPET}"
)
}
]
response_format = {
"type": "json_schema",
"json_schema": {
"schema": {
"type": "object",
"properties": {
"products": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"category": {"type": "string"},
"price": {"type": "string"}
},
"required": ["name", "category", "price"]
}
}
},
"required": ["products"]
}
}
}
# Bước 5: Gọi API chat completions với messages & response_format
try:
completion = client.chat.completions.create(
messages=messages,
model="sonar", # hoặc "sonar-pro" nếu gói của bạn hỗ trợ
response_format=response_format,
max_tokens=1500
)
except Exception as e:
print("Yêu cầu API thất bại:", str(e))
sys.exit(1)
# Bước 6: Trích xuất nội dung có cấu trúc một cách an toàn
raw_content = completion.choices[0].message.content
# SDK có thể trả về dict hoặc chuỗi JSON. Xử lý cả hai trường hợp:
if isinstance(raw_content, str):
try:
parsed = json.loads(raw_content)
except json.JSONDecodeError:
# Thử tìm một chuỗi con JSON
import re
m = re.search(r"(\{[\s\S]*\})", raw_content)
if m:
parsed = json.loads(m.group(1))
else:
print("Failed to parse JSON from model response.")
print("Raw response:", raw_content)
sys.exit(1)
else:
# Đã là cấu trúc giống dict
parsed = raw_content
products_data = parsed.get("products", [])
# Bước 7: In kết quả
for p in products_data:
print(p.get("name", ""), "-", p.get("category", ""), "-", p.get("price", ""))
# Bước 8: Lưu vào CSV (nếu tìm thấy sản phẩm)
if products_data:
with open("products.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["name", "category", "price"])
writer.writeheader()
writer.writerows(products_data)
print(f"Saved {len(products_data)} products to products.csv")
else:
print("No products found in the model output.")
Đây là những gì mã trên xuất ra:
The Legend of Zelda: Ocarina of Time - Action Adventure, Fantasy - 91,99 €
Super Mario Galaxy - Action, Platformer, 3D - 91,99 €
Super Mario Galaxy 2 - Action, Platformer, 3D - 91,99 €
Metroid Prime - Action, Shooter, First-Person, Sci-Fi - 89,99 €
Super Mario Odyssey - Action, Platformer, 3D - 89,99 €
Halo: Combat Evolved - Action, Shooter, First-Person, Sci-Fi -
Saved 6 products to products.csv
Sau khi bạn đã quen với quy trình làm việc, bạn có thể thử nghiệm với các kiểu câu lệnh khác nhau để tinh chỉnh cách mô hình cấu trúc đầu ra của nó.
Các biến thể Prompt mẫu
Một số ví dụ về prompt có thể được sử dụng cho Perplexity là:
- Kiểu bảng:
"Trả về một danh sách các từ điển. Mỗi từ điển phải chứa các khóa title, price_usd, và stock_status. Sử dụng định dạng ISO cho giá (ví dụ: 19.99)." - Định dạng dòng CSV:
"Xuất một CSV với hàng tiêu đề: title, price, sku, availability, và sau đó mỗi sản phẩm một dòng." - Prompt phạm vi giới hạn (cho các trang dài):
"Chỉ phân tích cú pháp phần chứa <div class="product-list">...</div> từ nội dung thông báo."
Thực Tiễn Tốt Nhất Khi Sử Dụng AI trong Web Scraping
Khi thiết kế các câu lệnh scraping có hỗ trợ AI, một vài thực tiễn tốt nhất có thể làm cho kết quả của bạn đáng tin cậy và nhất quán hơn nhiều. Vì các mô hình AI như Perplexity diễn giải hướng dẫn của bạn bằng ngôn ngữ tự nhiên, sự rõ ràng và cấu trúc ảnh hưởng trực tiếp đến độ chính xác của dữ liệu được trích xuất.
Đây là những điều cần lưu ý:
- Viết câu lệnh rõ ràng, cụ thể. Nói cho mô hình chính xác những gì cần trích xuất và cách định dạng nó.
- Tránh các truy vấn quá rộng. Thay vì yêu cầu “tất cả chi tiết sản phẩm,” hãy xác định các trường như tên, giá và xếp hạng.
- Xử lý đầu ra không nhất quán. Đôi khi phản hồi của AI có thể khác nhau về định dạng hoặc cấu trúc. Luôn bao gồm logic dự phòng để xử lý dữ liệu bị thiếu hoặc bị định dạng sai.
- Xác thực và ghi nhật ký mọi thứ. Giữ một bản ghi cả phản hồi thô và đã phân tích cú pháp. Điều này giúp gỡ lỗi các vấn đề và đảm bảo độ tin cậy theo thời gian.
Tuân theo các bước này giúp duy trì độ chính xác và đảm bảo AI của bạn không đi chệch hướng sang việc tạo ra các đầu ra không nhất quán hoặc không đầy đủ.
Đây là một ví dụ nhanh về một câu lệnh sạch, tập trung:
prompt = """
Trích xuất dữ liệu sản phẩm từ HTML sau.
Trả về JSON với các trường: name, price, và rating.
HTML: <div>...</div>
"""
Loại câu lệnh có cấu trúc, giới hạn này giúp kết quả sạch hơn và dễ phân tích cú pháp hơn sau này.
Khi nào nên dùng Perplexity AI so với API Web Scraping chuyên dụng?
Perplexity đặc biệt hiệu quả trong việc diễn giải và cấu trúc nội dung khi trang web đã có thể truy cập và không chặn các crawler. Nó lý tưởng để trích xuất tóm tắt văn bản, dữ liệu giá cả hoặc thông tin kiểu FAQ.
Tuy nhiên, scraping có hỗ trợ AI không phù hợp với mọi thứ.
- Nó có thể gặp khó khăn với CAPTCHA hoặc các hệ thống chống bot.
- Nó không dành cho việc crawl lớn hoặc trích xuất dữ liệu khối lượng lớn.
- Một số trang web có thể có các hạn chế pháp lý hoặc đạo đức đối với việc scraping.
Đối với những trường hợp đó, một công cụ chuyên dụng như Oxylabs Web Scraper API là lựa chọn phù hợp hơn. Nó được xây dựng để scraping quy mô lớn, đáng tin cậy – có khả năng xử lý các trang sử dụng nhiều JavaScript, thách thức CAPTCHA và cấu trúc trang động mà không cần thiết lập thủ công.
Oxylabs cũng cung cấp IP dân cư và trung tâm dữ liệu, nhắm mục tiêu theo vị trí địa lý và tiêu đề tùy chỉnh, giúp mô phỏng hành vi người dùng thực và truy cập nội dung được bản địa hóa. Những tính năng này làm cho nó lý tưởng cho các dự án mà tính nhất quán và khối lượng là quan trọng.
Đối với các nhà phát triển làm việc với các hệ thống chống bot khó khăn hoặc yêu cầu crawl lớn, Oxylabs có thể đảm nhận lớp thu thập dữ liệu, trong khi Perplexity tập trung vào việc biến HTML thô đó thành thông tin chi tiết sạch, có cấu trúc. Khi được sử dụng cùng nhau, chúng tạo ra một quy trình làm việc kết hợp mạnh mẽ – tự động hóa ở quy mô lớn với sự hiểu biết dựa trên AI.
Ví dụ Thực Tế và Trường Hợp Sử Dụng từ Cộng Đồng
Các nhà phát triển trên blog của Oxylabs và DEV.to thường chia sẻ các ví dụ thực tế về scraping có hỗ trợ AI. Nhiều người kết hợp các công cụ như ChatGPT hoặc Perplexity với các API scraping để trích xuất và cấu trúc dữ liệu thương mại điện tử hoặc đánh giá.
Ví dụ, Oxylabs trình bày các trường hợp AI giúp tóm tắt các danh mục sản phẩm lớn, phân loại danh sách hiệu quả hơn và trích xuất dữ liệu từ các tệp phi cấu trúc. Các cộng tác viên của DEV.to cũng làm nổi bật cách AI có thể làm sạch HTML lộn xộn và trích xuất thông tin có cấu trúc từ các trang động.
Cả hai cộng đồng đều ghi nhận những thách thức tương tự: việc phân tích cú pháp AI có thể không nhất quán khi các câu lệnh không được định nghĩa rõ ràng hoặc khi cấu trúc trang thay đổi thường xuyên.
Kết luận chung: kết hợp scraping truyền thống (để đáng tin cậy và quy mô) với diễn giải AI (để cấu trúc và thông tin chi tiết) mang lại kết quả hiệu quả và dễ thích nghi nhất – đặc biệt khi xử lý dữ liệu web phức tạp hoặc phi cấu trúc.
Kết Luận
Các công cụ AI như Perplexity không thay thế web scraping, chúng tăng cường nó. Các nhà phát triển nên thử nghiệm với các câu lệnh, tinh chỉnh hướng dẫn và sử dụng logic dự phòng cho các trường bị thiếu hoặc không nhất quán.
Luôn xác thực đầu ra để đảm bảo dữ liệu chính xác. Khi được kết hợp với một công cụ scraping mạnh mẽ xử lý nội dung động và các biện pháp chống bot, cách tiếp cận này tạo ra các quy trình nhanh hơn, có khả năng mở rộng và dễ bảo trì hơn.
Tóm lại, hãy coi AI như một lớp thông minh trên scraping, không phải là một sự thay thế. Kết hợp scraping truyền thống để ổn định với AI để cấu trúc mang lại bộ dữ liệu sạch hơn và quy trình làm việc hiệu quả hơn.



