Grok Web Scraping: Hướng Dẫn Thực Hành Python
Lead Scraping Automation Engineer
Tóm tắt:
- API của Grok nói tiếng OpenAI trôi chảy, điều này làm cho nó trở thành một công cụ trích xuất thay thế dễ dàng. Chỉ cần chỉ định SDK Python chính thức của OpenAI tại
https://api.x.ai/v1và mô hình sẽ chuyển đổi văn bản trang thành các bản ghi JSON vớitemperature=0vàresponse_format={"type": "json_object"}. - Điều mà Grok không làm là lấy dữ liệu. Mô hình không giữ trình duyệt và không có phiên; công cụ tìm kiếm trên máy chủ của xAI cung cấp các câu trả lời với kết quả trực tiếp, và việc trích xuất hàng loạt trang vẫn là công việc của bạn.
- Khoảng cách có thể thấy rõ trong một đoạn mã. Một lệnh GET đơn giản trên một trang demo render bằng JavaScript chứa 0 phần tử trích dẫn; cùng một URL qua API Trích xuất Toàn cầu không có Scrapeless với
js_renderchứa tất cả 10 — và HTML đã render đó là thứ Grok trích xuất từ. - Việc trích xuất là thật trong hướng dẫn này, không mang tính giả thuyết. Một lần chạy trực tiếp với trang đã render đã trả về tất cả 10 trích dẫn với tác giả và mảng thẻ còn nguyên vẹn — 3,211 token cho toàn bộ cuộc gọi.
- Chưa có khóa xAI? Yêu cầu tương tự chạy qua OpenRouter. Cùng một SDK OpenAI, khác
base_urlvà chuỗi mô hình; hướng dẫn này cho thấy cả hai con đường. - Miễn phí để bắt đầu về phía lấy dữ liệu. Tạo khóa API Scrapeless của bạn tại app.scrapeless.com.
Grok có thể lấy dữ liệu từ các trang web không?
Grok có thể đọc một trang bạn đưa cho nó và trả về chính xác các trường bạn yêu cầu; nó không thể tự lấy trang đó với khối lượng trích xuất lớn. Đó là hai nửa của mọi thiết lập "Grok web scraping", và nhầm lẫn chúng là cách mà các dự án bị đình trệ. API xAI mở ra một mô hình ngôn ngữ — một mô hình tình cờ dễ dàng để thiết lập, vì điểm cuối chấp nhận cùng một hình dạng yêu cầu như OpenAI — nhưng việc lấy dữ liệu HTTP, kết xuất JavaScript, trạng thái phiên và những thách thức truy cập nằm ngoài nó.
xAI thực sự cung cấp một công cụ tìm kiếm trên máy chủ, và nó xứng đáng có một câu mô tả công bằng: nó cho phép Grok tìm kiếm và đọc web trực tiếp để cung cấp một câu trả lời. Đó là việc lấy dữ liệu cho câu hỏi - trả lời. Nó không cho bạn quyền kiểm soát về các trang nào được lấy, cách chúng được render, hoặc bạn có thể xử lý bao nhiêu — ba điều mà một quy trình trích xuất được xây dựng trên.
Vì vậy, kiến trúc làm việc là hai lớp: một lớp lấy dữ liệu trả về HTML đã render chính xác, và Grok như là lớp trích xuất biến nó thành các bản ghi. Một sự phân biệt nữa trước khi đi vào mã: hướng dẫn này chỉ định Grok về phía web. Chỉ định một công cụ trích xuất về phía Grok — thu thập các câu trả lời của nó thành dữ liệu — là nhiệm vụ ngược lại, được đề cập bởi hướng dẫn API Trích xuất Grok và giải thích về trình trích xuất LLM.
Cài đặt
Toàn bộ chuỗi công cụ là SDK OpenAI cộng với requests — các phiên bản mà hướng dẫn này được viết dựa trên là openai 2.34.0 và requests hiện tại:
bash
pip install "openai==2.34.0" requests
Cấu hình
Các khóa được lưu trong môi trường, không bao giờ trong mã nguồn:
bash
export XAI_API_KEY="xai-your_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
Lấy một trang mà Grok thực sự có thể đọc
Chất lượng trích xuất phụ thuộc vào độ tin cậy của việc lấy dữ liệu, vì vậy hãy bắt đầu từ nơi hầu hết các hướng dẫn Grok kết thúc. Trên các trang đã render bằng JavaScript, tài liệu mà một khách hàng HTTP đơn giản nhận được không phải là tài liệu mà một người đọc thấy — nội dung chỉ đến sau khi các script xây dựng DOM, một vòng đời được định nghĩa bởi các thông số kỹ thuật về script HTML. Một đoạn script cho thấy sự khác biệt và lưu phiên bản có giá trị để trích xuất từ:
python
# fetch_rendered.py — GET đơn giản so với kết xuất phía máy chủ, cùng một URL
import os
import requests
URL = "https://quotes.toscrape.com/js/"
MARKER = '<span class="text"'
plain = requests.get(URL, timeout=60).text
print(f"GET đơn giản: {len(plain):,} ký tự | số phần tử trích dẫn: {plain.count(MARKER)}")
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": URL, "method": "GET", "js_render": True},
},
timeout=120,
)
resp.raise_for_status()
rendered = resp.json().get("data", "")
print(f"đã render: {len(rendered):,} ký tự | số phần tử trích dẫn: {rendered.count(MARKER)}")
with open("page.html", "w", encoding="utf-8") as f:
f.write(rendered)
Chạy in ra quote elements: 0 cho fetch thông thường và quote elements: 10 cho phiên bản đã render. Việc render, mở khóa và định tuyến proxy đều diễn ra trên máy chủ trong một POST — Universal Scraping API là lớp fetch, và page.html giờ trở thành nơi mà một mô hình có thể trích xuất từ đó.
Triển khai cơ bản: Grok như là extractor
Điểm cuối xAI nhận yêu cầu chat-completions tiêu chuẩn của OpenAI. Hai tham số mang lại độ tin cậy: temperature=0 giữ cho đầu ra ổn định giữa các lần chạy, và chế độ JSON giữ cho nó có thể phân tích. Gọi đúng các khóa bạn muốn trong thông điệp hệ thống và cho mô hình biết phải làm gì với các giá trị thiếu.
Lưu ý: Khối này cần một
XAI_API_KEYcó tín dụng — đ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 tương tự trực tiếp qua OpenRouter, với đầu ra được ghi lại.
python
# extract_grok.py — Trích xuất Grok qua xAI API (cần XAI_API_KEY)
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.x.ai/v1",
api_key=os.environ["XAI_API_KEY"],
)
page_html = open("page.html", encoding="utf-8").read()
completion = client.chat.completions.create(
model="grok-4.5",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Trích xuất mọi trích dẫn. Trả lời CHỈ với JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}. Sử dụng null cho các giá trị thiếu.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"đã trích xuất {len(data['quotes'])} trích dẫn")
grok-4.5 là mô hình mà tài liệu hiện tại của xAI tập trung; thay thế bằng bất kỳ cấp độ nào mà tài khoản của bạn hoạt động. Hình dạng yêu cầu không thay đổi.
Không có khóa xAI? Chạy cùng một yêu cầu qua OpenRouter
Vì yêu cầu là hình dạng OpenAI từ đầu đến cuối, một khóa tổng hợp hoạt động với hai sửa đổi: base_url và chuỗi mô hình. Đây là biến thể mà hướng dẫn này thực hiện thực tế — fetch và trích xuất trong một kịch bản tự chứa:
python
# 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://quotes.toscrape.com/js/", "method": "GET", "js_render": True},
},
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="x-ai/grok-4.20",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Trích xuất mọi trích dẫn. Trả lời CHỈ với JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}. Sử dụng null cho các giá trị thiếu.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"đã trích xuất {len(data['quotes'])} trích dẫn từ trang đã render")
print(json.dumps(data["quotes"][0], ensure_ascii=False))
Chạy thực tế đã trích xuất tất cả 10 trích dẫn và in ra trích dẫn đầu tiên:
text
đã trích xuất 10 trích dẫn từ trang đã render
{"text": "“Thế giới mà chúng ta đã tạo ra là một quá trình của tư duy chúng ta. Nó không thể bị thay đổi mà không thay đổi tư duy của chúng ta.”", "author": "Albert Einstein", "tags": ["change", "deep-thoughts", "thinking", "world"]}
Các mảng tác giả và thẻ được giữ nguyên, và toàn bộ cuộc gọi tiêu tốn 3,211 token. Đó là toàn bộ trình thu thập dữ liệu: một POST để fetch, một completion để trích xuất, không có lựa chọn nào ở đây.
Nhận khóa API của bạn trong gói miễn phí: app.scrapeless.com
Mô hình nâng cao
- Ghim cấu trúc trong thông điệp hệ thống, không trong lời nhắc của người dùng. HTML trang sẽ ở trong lượt người dùng; hợp đồng ở trong lượt hệ thống nơi nó tồn tại qua các vòng lặp trang.
- Lặp lại trong Python, không trong lời nhắc. Một trang mỗi completion giữ cho hồ sơ không bị rò rỉ qua các ranh giới và làm cho các thất bại có thể gán cho một URL cụ thể.
- Gửi ít nội dung hơn khi bạn có thể. Grok đọc toàn bộ tài liệu bạn gửi, chrome và tất cả. Tách rời container nội dung — hoặc fetch markdown thay vì HTML — giảm thiểu chi phí token khoảng theo tỷ lệ.
- Đối xử với thẻ và danh sách một cách rõ ràng. Đặt tên
tags:[str]trong sơ đồ là cách tạo ra các mảng sạch trong quá trình chạy ở trên; để lại các trường danh sách không mô tả và các mô hình sẽ làm phẳng chúng thành chuỗi.
Khắc phục sự cố
- Văn bản thay vì JSON. Bạn đã bỏ
response_format={"type": "json_object"}— với nó, điểm cuối ràng buộc đầu ra; không có nó, bạn đang phân tích thiện chí. - Mong đợi mười bản ghi, trả về ba. Kiểm tra những gì bạn đã lấy trước khi đổ lỗi cho mô hình: đếm một yếu tố đã biết trong HTML theo cách mà kịch bản lấy dữ liệu đã làm. Một lần cập nhật gần như rỗng có nghĩa là vấn đề hiển thị, được khắc phục ở tầng lấy dữ liệu với
js_render. - Đầu ra khác nhau trên đầu vào giống nhau. Đặt
temperature=0; việc trích xuất không phải là một nhiệm vụ sáng tạo. - Chi phí tăng lên. Chi phí token theo dõi kích thước đầu vào. Cắt trang, không nhóm lại, và theo dõi số lượng token từng trang theo cách mà quá trình chạy ở trên báo cáo.
Kết luận
Grok xứng đáng có chỗ đứng trong một bộ thu thập dữ liệu như là lớp không bao giờ thấy mạng: yêu cầu theo hình dạng OpenAI, cài đặt xác định, một trang vào, một đối tượng JSON ra. Lớp quyết định xem bất kỳ điều gì trong số đó có khả thi hay không là phần lấy dữ liệu — bản in 0 so với 10 của kịch bản đầu tiên giải quyết câu hỏi đó — và một POST được hiển thị từ máy chủ đóng khoảng cách. Kết nối hai thứ này lại với nhau và mười trích dẫn của trang demo xuất hiện như là các bản ghi đã được xác thực, có thẻ và tất cả.
Sẵn sàng cung cấp các trang thực cho Grok?
Lớp lấy dữ liệu trong hướng dẫn này là một POST cho mỗi trang trên Universal Scraping API — kế hoạch và khối lượng có trên trang giá, và tài liệu dành cho nhà phát triển bao gồm các tham số unlocker.webunlocker. Tạo một khóa trên kế hoạch miễn phí tại app.scrapeless.com và chạy lại cả hai kịch bản như đã viết.
Câu hỏi thường gặp
Hỏi: Grok có thể thu thập dữ liệu từ các trang web một mình không?
Không. API Grok trích xuất từ văn bản bạn cung cấp; nó không thể phát hành yêu cầu, hiển thị JavaScript hoặc giữ phiên. Công cụ tìm kiếm web của nó đọc web trực tiếp để đưa ra câu trả lời, nhưng việc chọn trang, độ trung thực của hiển thị, và khối lượng vẫn nằm ngoài tầm kiểm soát của bạn — một quy trình thu thập dữ liệu cần có lớp lấy dữ liệu riêng.
Hỏi: Tìm kiếm web tích hợp của Grok có phải là thu thập dữ liệu web không?
Những công việc khác nhau. Công cụ tìm kiếm lấy bối cảnh để mô hình có thể trả lời một câu hỏi; thu thập dữ liệu lấy các trang cụ thể để bạn có thể trích xuất các trường cụ thể với khối lượng bạn chọn. Sử dụng công cụ khi bạn muốn có câu trả lời, và quy trình hai lớp trong hướng dẫn này khi bạn muốn có dữ liệu.
Hỏi: Điều này khác gì với bộ thu thập dữ liệu Grok?
Hướng đi. Ở đây, Grok là người phân tích và web là mục tiêu. Một bộ thu thập dữ liệu Grok đảo ngược nó — nó ghi lại các câu trả lời của chính Grok dưới dạng dữ liệu có cấu trúc, mà Scrapeless gửi đi như một tác nhân; hướng dẫn API Grok Scraper liên kết trong phần giới thiệu bao gồm công việc đó.
Hỏi: Mô hình Grok nào tôi nên sử dụng cho việc trích xuất?
Mô hình rẻ nhất mà giữ sơ đồ của bạn. Việc trích xuất với một hợp đồng JSON nghiêm ngặt và temperature=0 không phải là một nhiệm vụ nặng về lý luận, vì vậy hãy bắt đầu nhỏ — quá trình chạy trực tiếp trong hướng dẫn này đã sử dụng một cấp độ Grok có giá thấp hơn qua OpenRouter và trả về tất cả 10 bản ghi một cách chính xác — và chỉ nâng cấp nếu các trường bắt đầu trả về sai.
Hỏi: Việc thu thập dữ liệu với Grok có hợp pháp không?
Mô hình không thay đổi quy tắc thu thập. Chỉ lấy các trang công cộng, tôn trọng các điều khoản của trang web và các chỉ thị của robot được tiêu chuẩn hóa bởi Giao thức loại trừ Robot, giữ khối lượng ở mức giới hạn, và xử lý dữ liệu cá nhân theo quy định của pháp luật áp dụng cho bạn — cộng với các điều khoản sử dụng của xAI ở phía 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.



