Mistral Web Scraping: Đọc Dữ Liệu Ẩn Trong Các Thuộc Tính HTML
Scraping and Proxy Management Expert
TL;DR:
- Mistral đọc dữ liệu không có trong văn bản hiển thị, và một lần chạy trực tiếp chứng minh điều đó. Khi cung cấp một trang danh mục laptop đã được hiển thị,
mistralai/ministral-3b-2512đã trả về 6 sản phẩm với tên sản phẩm đầy đủ, không bị cắt ngắn và một đánh giá số — cả hai giá trị này chỉ tồn tại trong các thuộc tính HTML, không phải trong văn bản mà người đọc thấy. - Cấp độ Mistral rẻ nhất hiện tại là một dòng mô hình nhỏ đặc dụng, không phải là một phiên bản rút gọn của flagship. Ministral 3 là gia đình hiệu quả được Mistral xây dựng đặc biệt; hướng dẫn này kiểm tra danh mục OpenRouter trực tiếp để tìm mục rẻ nhất hiện tại, thay vì sử dụng lại tên "Mistral 7B" cũ từ trí nhớ.
- Mô hình vẫn không thể truy xuất. Việc kết xuất, các phiên và các thách thức về quyền truy cập thuộc về một lớp truy xuất; hướng dẫn này thực hiện một POST trên mỗi trang thông qua API Thuật Toán Tổng Quát Scrapeless.
- Dữ liệu chỉ có trong thuộc tính là một cái bẫy thực sự cho việc trích xuất. Văn bản liên kết hiển thị trên một trang có thể đọc là
"Packard 255 G2..."trong khi tên sản phẩm thực sự nằm toàn bộ trong thuộc tínhtitlecách đó vài ký tự — sơ đồ và tên nhắc nhở của hướng dẫn này chỉ rõ chính xác nơi để đọc. - Chưa có khóa Mistral? Yêu cầu giống hệt sẽ chạy qua OpenRouter. Hướng dẫn này đã thực hiện trực tiếp trên
mistralai/ministral-3b-2512và cho thấy đầu ra đã được ghi lại. - Miễn phí để bắt đầu ở phía truy xuất. Tạo khóa API Scrapeless của bạn tại app.scrapeless.com.
Mistral có thể thu thập dữ liệu từ các trang web không?
Mistral trích xuất; nó không thu thập. Gửi cho nó văn bản trang và một sơ đồ và nó trả về các trường bạn đặt tên — một cách rẻ tiền, vì mức giá của gia đình mô hình nhỏ nằm trong số những mức thấp nhất của bất kỳ API hiện tại nào. Những gì nó không thể làm là truy xuất một URL, thực thi JavaScript dựng nên một trang, hoặc quản lý các phiên và thách thức quyền truy cập ở khối lượng thu thập dữ liệu. Công việc đó thuộc về một lớp truy xuất, được giữ riêng biệt khỏi mô hình với mục đích.
Đây là một bề mặt thực sự mở: không có bài viết nào trước đó trên trang này hướng dẫn ghép nối Mistral với một lớp truy xuất trực tiếp cho việc trích xuất web. Đối với câu hỏi lân cận về gia đình mô hình nào để tiếp cận, giải thích về trình trích xuất LLM và danh sách xếp hạng các trình trích xuất LLM bao quát thể loại này.
Cài đặt
SDK chính thức của Mistral bao phủ con đường gốc, openai bao phủ con đường OpenRouter, và requests bao phủ lớp truy xuất:
bash
pip install "mistralai==2.7.2" "openai==2.48.0" requests
Cấu hình
bash
export MISTRAL_API_KEY="your_mistral_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
Truy xuất một trang nơi dữ liệu thực sự ẩn trong các thuộc tính
Mục tiêu demo là một sandbox danh mục laptop công khai, nơi liên kết sản phẩm hiển thị bị cắt ngắn ("Packard 255 G2...") nhưng tên đầy đủ sống trong thuộc tính title của liên kết đó, và xếp hạng sao không được lấy từ mã biểu tượng mà từ giá trị data-rating trên một phần tử bao bọc. Một POST tới API Thuật Toán Tổng Quát trả về trang đã được kết xuất:
python
# fetch_laptops.py — một POST trả về trang danh mục laptop đã được kết xuất
import os
import requests
resp = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {
"url": "https://webscraper.io/test-sites/e-commerce/static/computers/laptops",
"method": "GET",
"js_render": True,
},
},
timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")
print(f"đã thu thập {len(html):,} ký tự")
print("thẻ sản phẩm:", html.count('class="card thumbnail"'))
with open("page.html", "w", encoding="utf-8") as f:
f.write(html)
Chạy lệnh in ra 6 thẻ sản phẩm từ một trang danh mục trực tiếp được lưu trữ trên một trang thực hành thu thập công khai — một trang nhỏ, được giới hạn một cách có chủ đích thay vì danh sách đầy đủ hàng trăm mục mà miền này cũng phục vụ.
Triển khai cơ bản: Mistral như là người trích xuất
SDK chính thức của chat.complete có phương thức nhận response_format={"type": "json_object"}, được tài liệu hóa trong Tài liệu tham khảo chế độ JSON của Mistral. Cấp độ Mistral rẻ nhất hiện tại là ministral-3b-2512 — mô hình nhỏ nhất trong gia đình Ministral 3, không phải tên Mistral 7B cũ vẫn đang lưu hành trong các hướng dẫn trước đây.
Chú ý: Khối này cần một
MISTRAL_API_KEYvới 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 khai thác giống hệt trực tiếp thông qua OpenRouter, với đầu ra captured.
python
# extract_mistral.py — khai thác Mistral gốc (cần MISTRAL_API_KEY)
import json
import os
from mistralai.client import Mistral
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
page_html = open("page.html", encoding="utf-8").read()
response = client.chat.complete(
model="ministral-3b-2512",
temperature=0,
max_tokens=2000,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Khai thác mọi laptop. Trả lời CHỈ với JSON: '
'{"laptops":[{"title":str,"price_usd":number,"rating":int,"review_count":int}]}. '
"title là tên đầy đủ của sản phẩm từ thuộc tính title của liên kết, không phải văn bản hiển thị rút gọn. "
"rating là 1-5, đọc từ thuộc tính data-rating.",
},
{"role": "user", "content": page_html},
],
)
data = json.loads(response.choices[0].message.content)
print(f"đã khai thác {len(data['laptops'])} laptop")
Không có thủ thuật prefill, không có đối tượng schema riêng biệt — response_format một mình là đủ cho chế độ JSON của Mistral.
Không có khóa Mistral? Chạy qua OpenRouter
Bởi vì cả hai giao diện đều nói cùng hợp đồng chế độ JSON, biến thể tổng hợp khác nhau chỉ bởi một chút hơn là khách hàng và URL cơ sở. Đây là phiên bản mà hướng dẫn này thực hiện một cách thực tế, lấy và khai thác trong một kịch bản tự chứa:
python
# extract_openrouter.py — khai thác giống nhau, thực hiện thông qua OpenRouter
import json
import os
import requests
from openai import OpenAI
resp = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {
"url": "https://webscraper.io/test-sites/e-commerce/static/computers/laptops",
"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="mistralai/ministral-3b-2512",
temperature=0,
max_tokens=2000,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Khai thác mọi laptop. Trả lời CHỈ với JSON: '
'{"laptops":[{"title":str,"price_usd":number,"rating":int,"review_count":int}]}. '
"title là tên đầy đủ của sản phẩm từ thuộc tính title của liên kết, không phải văn bản hiển thị rút gọn. "
"rating là 1-5, đọc từ thuộc tính data-rating.",
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"đã khai thác {len(data['laptops'])} laptop")
for row in data["laptops"]:
print(json.dumps(row, ensure_ascii=False))
Chạy trực tiếp hoàn trả tất cả 6 laptop, mỗi trường khớp chính xác với trang nguồn:
text
đã khai thác 6 laptop
{"title": "Packard 255 G2", "price_usd": 416.99, "rating": 2, "review_count": 2}
{"title": "Aspire E1-510", "price_usd": 306.99, "rating": 3, "review_count": 2}
{"title": "ThinkPad T540p", "price_usd": 1178.99, "rating": 1, "review_count": 2}
{"title": "ProBook", "price_usd": 739.99, "rating": 4, "review_count": 8}
{"title": "ThinkPad X240", "price_usd": 1311.99, "rating": 3, "review_count": 12}
{"title": "Aspire E1-572G", "price_usd": 581.99, "rating": 1, "review_count": 2}
Mỗi tiêu đề, giá cả, xếp hạng và số lượng đánh giá khớp hoàn toàn với mã nguồn từng cái một — mô hình đọc thuộc tính title cho tên đầy đủ thay vì văn bản liên kết rút gọn, và thuộc tính data-rating thay vì đếm mã icon. Toàn bộ cuộc gọi: 28,797 token, gần như tất cả là đầu vào, vì trang đã lấy mang theo một trang đầy điều hướng và mã kịch bản xung quanh sáu thẻ sản phẩm nhỏ.
Nhận khóa API của bạn theo kế hoạch miễn phí: app.scrapeless.com
Mẫu nâng cao
- Nói chính xác nơi giá trị sống khi nó không có trong văn bản hiển thị. "Đọc tiêu đề đầy đủ từ thuộc tính
title" và "đọc đánh giá từdata-rating" là những gì đã tạo ra đầu ra chính xác ở đây — một yêu cầu chỉ nói "trích xuất tiêu đề" mời gọi mô hình trả lại chuỗi rút gọn mà nó có thể thấy. - Theo dõi tỷ lệ token đầu vào và đầu ra. Chạy này đã sử dụng 28.554 token cho đầu vào so với chỉ 243 cho đầu ra — chrome xung quanh trang, không phải sáu bản ghi, chiếm ưu thế trong hóa đơn. Cắt bỏ đến container lưới sản phẩm trước khi gửi sẽ giảm con số đó đi rất nhiều mà không mất nội dung có thể trích xuất.
- Giữ nhiệt độ ở mức không cho việc trích xuất. Các mô hình Ministral phản ứng tốt với
temperature=0cho các nhiệm vụ có cấu trúc; bất cứ điều gì cao hơn sẽ tái giới thiệu rủi ro diễn đạt lại mà làm hỏng các trường trùng khớp chính xác như thuộc tính tiêu đề. - Dành các mức Mistral lớn hơn cho các trang thực sự khó khăn. Mức 3B đọc dữ liệu mã hóa thuộc tính mà không có lỗi nào ở đây; chỉ nâng cấp nếu một trường cụ thể liên tục sai trên đầu vào sạch khác.
Khắc phục sự cố
- Tiêu đề trở lại rút gọn, chỉ khớp với văn bản hiển thị. Lời yêu cầu không nói để đọc thuộc tính. Nêu chính xác nguồn ("thuộc tính
titlecủa liên kết") thay vì chỉ trường. - Đánh giá sai hoặc tất cả giống nhau. Giá trị thường nằm trong một thuộc tính (
data-rating) thay vì một biểu tượng có thể đếm hoặc một số đơn giản trong văn bản — nói nơi nó sống, giống như cách yêu cầu hướng dẫn này làm. - Ít laptop hơn số lượng thực tế có trên trang. Kiểm tra số lượng thẻ của HTML đã thu thập trước, giống như cách script thu thập ở trên làm — một lần thu thập ngắn là một vấn đề hiển thị, không phải điều mà lời yêu cầu trích xuất có thể sửa.
- Đầu ra thay đổi giữa các lần chạy giống hệt nhau. Đặt
temperature=0; trích xuất là một nhiệm vụ sao chép, không phải là một nhiệm vụ sinh.
Kết luận
Tầng Mistral giá rẻ nhất hiện tại đã xử lý một cái bẫy thực sự một cách sạch sẽ: một tiêu đề hiển thị rút gọn, một đánh giá ẩn trong một thuộc tính dữ liệu, và nó đã đọc cả hai một cách chính xác chỉ với một cờ response_format và hai câu nói cho nó biết nơi giá trị thực sống. Điều mà mô hình vẫn không thể làm là lấy trang đó ngay từ đầu — một POST thông qua một lớp thu thập dành riêng cung cấp HTML, và sơ đồ sáu dòng ở trên biến nó thành các bản ghi kiểu mà không có mã chọn nào trong ống dẫn.
Sẵn sàng cung cấp Mistral các trang thực tế?
Lớp thu thập ở đây là Universal Scraping API — các kế hoạch và khối lượng yêu cầu có trên trang định giá, với mỗi tham số unlocker.webunlocker trong tài liệu phát triển. Tạo một khóa trên kế hoạch miễn phí tại app.scrapeless.com và cả hai script sẽ chạy như đã viết.
Câu hỏi thường gặp
Q: Mistral có thể tự động thu thập dữ liệu từ các trang web không?
Không. API Mistral trích xuất từ văn bản bạn cung cấp; nó không thể thực hiện các yêu cầu HTTP, hiển thị JavaScript, hoặc giữ phiên. Mỗi cấu hình thu thập dữ liệu Mistral hoạt động đều ghép nối nó với một lớp thu thập trả về nội dung trang trung thực.
Q: Mô hình Mistral nào nên tôi sử dụng cho việc trích xuất thu thập dữ liệu web?
ministral-3b-2512 — tầng hiện tại giá rẻ nhất trong gia đình mô hình nhỏ Mistral 3 chuyên dụng, kiểm tra chống lại danh mục OpenRouter trực tiếp thay vì một tên "Mistral 7B" cũ hơn. Lần chạy trực tiếp trong hướng dẫn này đã sử dụng nó và trả về tất cả 6 bản ghi với mọi trường khớp chính xác với trang nguồn.
Q: Mistral xử lý dữ liệu bị ẩn trong các thuộc tính HTML thay vì văn bản hiển thị như thế nào?
Chính xác, khi lời yêu cầu nói rõ nơi cần tìm. Thông điệp hệ thống của hướng dẫn này đã chỉ định chính xác thuộc tính cho cả tiêu đề không bị rút gọn và đánh giá số, mà không có hướng dẫn đó, một mô hình có xu hướng trả lại văn bản rút gọn mà nó có thể nhìn thấy thay thế.
Q: Mistral cục bộ qua Ollama so với API — tôi nên sử dụng cái nào cho việc trích xuất thu thập dữ liệu?
Đường dẫn API trong hướng dẫn này không cần GPU hoặc tải mô hình cục bộ và trả về kết quả trong một yêu cầu; một triển khai Ollama cục bộ đổi tiện lợi đó để có giá không 0 cho mỗi token và toàn bộ dữ liệu cục bộ. Cả hai đều chỉ định kiến trúc thu thập sau đó trích xuất cho các môi trường thực thi khác nhau — chọn API cho các công việc có khối lượng thấp hoặc bùng nổ, cục bộ cho các công việc có khối lượng cao hoặc nhạy cảm với dữ liệu.
Q: Có hợp pháp khi thu thập dữ liệu bằng Mistral không?
Lớp khai thác không thay đổi 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ị của robot được tiêu chuẩn hóa bởi Giao thức loại trừ robot, giữ cho khối lượng có giới hạn, và xử lý bất kỳ dữ liệu cá nhân nào theo luật hiện hành - cộng với các điều khoản sử dụng của Mistral về 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.



