selectolax Web Scraping: Phân tích HTML nhanh chóng trong Python
Senior Web Scraping Engineer
Tóm tắt:
- selectolax phân tích HTML bằng cách sử dụng các bộ chọn CSS và làm điều đó nhanh chóng, vì nó bao bọc động cơ Lexbor dựa trên C thay vì phân tích bằng Python thuần túy.
- Điều mà selectolax không làm là lấy dữ liệu. Nó không có khách hàng HTTP và không xử lý JavaScript; cung cấp cho nó byte và nó sẽ phân tích, không hơn không kém.
- Khoảng cách xuất hiện trong một tập lệnh. Một yêu cầu GET đơn giản trên một trang demo được render bằng JavaScript cho selectolax 0 nút trích dẫn; cùng một URL được lấy thông qua API Scraping Universal Scrapeless với
js_renderđã cho nó tất cả 10. - Phân tích là có thật trong hướng dẫn này. Một lần chạy đã kéo tất cả 10 trích dẫn với tác giả và mảng thẻ nguyên vẹn từ HTML đã render, sử dụng
cssvàcss_first. - Hai lớp được tách biệt rõ ràng. Scrapeless lấy dữ liệu và render; selectolax biến byte thành bản ghi. Không ai chạm vào công việc của người kia.
- Tự do bắt đầu ở phía lấy dữ liệu. Tạo khóa API Scrapeless của bạn tại app.scrapeless.com.
selectolax là gì, và không phải là gì
selectolax là một trình phân tích HTML Python được xây dựng để nhanh chóng. Nó liên kết với động cơ Lexbor, một thư viện C thực hiện tiêu chuẩn HTML, vì vậy việc phân tích một tài liệu và chạy các bộ chọn CSS diễn ra trong mã biên dịch thay vì trong thông dịch viên. Đối với việc trích xuất quy mô lớn — hàng ngàn trang, vòng lặp chặt chẽ — sự khác biệt đó là lý do mọi người chọn nó hơn các trình phân tích nặng nề hơn.
Nó là một trình phân tích và chỉ là một trình phân tích. selectolax không có khách hàng HTTP, không giữ phiên, và không chạy JavaScript. Cung cấp cho nó một chuỗi hoặc byte và nó xây dựng một cây mà bạn có thể truy vấn; yêu cầu nó lấy một URL và không có phương thức nào cho điều đó, theo thiết kế. Vì vậy, mỗi cài đặt "selectolax web scraping" là hai lớp: một cái gì đó lấy HTML chính xác, và selectolax biến nó thành dữ liệu. Hướng dẫn này sử dụng API Scraping Universal Scrapeless cho lớp đầu tiên, vì một khách hàng HTTP đơn giản trả về các byte sai trên bất kỳ trang nào xây dựng nội dung của nó bằng JavaScript. Để có cái nhìn rộng hơn về phần Python, hướng dẫn web scraping Python bao quát hệ sinh thái xung quanh điều này.
Cài đặt
selectolax và requests là toàn bộ chuỗi công cụ. Phiên bản mà hướng dẫn này đã được viết là selectolax 0.4.11:
bash
pip install "selectolax==0.4.11" requests
Giữ khóa của bạn trong môi trường, không bao giờ trong mã nguồn:
bash
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
Lấy HTML đáng để phân tích
Chất lượng phân tích được giới hạn bởi độ chính xác của việc lấy dữ liệu, vì vậy hãy bắt đầu từ đó. Trên một trang được 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à người đọc thấy: nội dung chỉ đến sau khi các tập lệnh xây dựng DOM, một vòng đời được định nghĩa bởi tiêu chuẩn lập trình HTML. Một tập lệnh đo sự khác biệt thông qua chính selectolax:
python
# fidelity.py — điều mà selectolax thấy: GET đơn giản so với render phía máy chủ
import os
import requests
from selectolax.lexbor import LexborHTMLParser
URL = "https://quotes.toscrape.com/js/"
plain = requests.get(URL, timeout=60).text
print("plain GET chars:", len(plain), "| quote nodes:", len(LexborHTMLParser(plain).css("div.quote")))
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": URL, "js_render": True}},
timeout=120,
)
resp.raise_for_status()
rendered = resp.json().get("data", "")
print("rendered chars:", len(rendered), "| quote nodes:", len(LexborHTMLParser(rendered).css("div.quote")))
Chạy dòng lệnh sẽ in 0 nút trích dẫn cho lần lấy dữ liệu đơn giản và 10 cho lần đã render:
text
plain GET chars: 5806 | quote nodes: 0
rendered chars: 8940 | quote nodes: 10
Việc render, mở khóa và định tuyến proxy đều diễn ra phía máy chủ trong một POST — API Scraping Universal là lớp lấy dữ liệu, và những byte đã render là điều mà selectolax nên phân tích.
Phân tích nó với selectolax
Với HTML thực sự trong tay, selectolax thực hiện việc trích xuất. css trả về mọi nút phù hợp với bộ chọn; css_first trả về nút đầu tiên, vì vậy bạn có thể lấy một trường từ mỗi bản ghi. Các bộ chọn tuân theo tiêu chuẩn bộ chọn W3C, cùng một cú pháp mà bạn đã sử dụng trong CSS:
python
# extract.py — lấy trang đã render, sau đó trích xuất các bản ghi bằng selectolax
import os
import requests
from selectolax.lexbor import LexborHTMLParser
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://quotes.toscrape.com/js/", "js_render": True}},
timeout=120,
)
resp.raise_for_status()
tree = LexborHTMLParser(resp.json().get("data", ""))
records = []
for quote in tree.css("div.quote"):
records.append({
"text": quote.css_first("span.text").text(),
"author": quote.css_first("small.author").text(),
"tags": [tag.text() for tag in quote.css("a.tag")],
})
print("records:", len(records))
print("first author:", records[0]["author"])
print("first tags:", records[0]["tags"])
Chạy trực tiếp trả về tất cả 10 bản ghi, với tác giả và mảng thẻ nguyên vẹn ở bản đầu tiên:
text
records: 10
first author: Albert Einstein
first tags: ['change', 'deep-thoughts', 'thinking', 'world']
Đó là toàn bộ trình cào: một POST để truy xuất và kết xuất, một cây để truy vấn. text() trả về nội dung văn bản của nút, và việc xây dựng một danh sách từ điển cho mỗi bản ghi là mẫu có thể mở rộng cho bất kỳ khối lặp lại nào trên một trang.
Lấy khóa API của bạn trong gói miễn phí: app.scrapeless.com
Mẫu nâng cao
- Sử dụng
LexborHTMLParsercho tốc độ,HTMLParsercho backend khiêm tốn. selectolax cung cấp cả hai engine phía sau cùng một API; Lexbor là engine mới hơn, nhanh hơn và là mặc định đúng cho khối lượng lớn. - Ưu tiên
css_firstvớidefault.node.css_first("span.text", default=None)trả vềNonethay vì ném ra ngoại lệ khi một trường bị thiếu, điều này giữ cho một vòng lặp qua các bản ghi không đồng đều không bị sập trên một trang khác. - Đọc các thuộc tính với
.attributes. Đối với liên kết và hình ảnh,node.attributes.get("href")lấy thuộc tính từ nút - bộ chọn tìm kiếm phần tử,.attributesđọc dữ liệu của nó. - Lấy markdown khi bạn không cần cây. Nếu bạn chỉ muốn văn bản có thể đọc được, API Scrapeless có thể trả về nội dung được kết xuất trực tiếp; hãy sử dụng selectolax khi bạn cần kiểm soát cấp độ bộ chọn đối với các trường có cấu trúc.
Khắc phục sự cố
- Không có nút nào từ một trang mà bạn có thể nhìn thấy trong trình duyệt. Nội dung được kết xuất bằng JavaScript và lần lấy của bạn trả về HTML trước khi kết xuất. Đếm một bộ chọn đã biết theo cách mà script đầu tiên làm; một cây gần như rỗng là một vấn đề lấy, đã được khắc phục với
js_render, không phải là vấn đề bộ chọn. AttributeError: 'NoneType' object has no attribute 'text'. Mộtcss_firstkhông tìm thấy gì và bạn đã gọi.text()trênNone. Truyềndefault=Nonevà kiểm tra trước khi đọc, hoặc xác nhận rằng bộ chọn khớp với mã HTML đã được kết xuất.- Văn bản có khoảng trắng thừa.
text()trả về văn bản gốc của nút; gọi.strip()hoặc truyền các tùy chọndeep=True/separatorkhi một nút chứa các phần tử con mà văn bản của chúng bạn muốn nối lại. - Mã hóa trông sai. Truyền byte phản hồi thay vì một chuỗi bị mã hóa sai; selectolax đọc mã hóa đã khai báo của tài liệu khi bạn đưa cho nó byte.
Kết luận
selectolax xứng đáng với vị trí của nó như là lớp phân tích mà không bao giờ chạm vào mạng: đưa cho nó HTML trung thực và nó trả về các bản ghi nhanh chóng, với các bộ chọn CSS mà bạn đã biết. Lớp quyết định liệu bất kỳ điều gì đó là có thể hay không là việc lấy — số đếm 0 so với 10 của script đầu tiên đã giải quyết — và một POST kết xuất từ máy chủ đã khắc phục khoảng cách. Kết nối hai điều này với nhau và mười trích dẫn của trang demo đến dưới dạng các từ điển sạch sẽ, có thẻ và tất cả.
Tạo một tài khoản Scrapeless miễn phí để có được khóa API, và tài liệu cho nhà phát triển đề cập đến các tham số của unlocker.webunlocker. Kiểm tra giá Scrapeless khi bạn lập kế hoạch cho một công việc định kỳ.
Câu hỏi thường gặp
H: selectolax có thể tự cào các trang web không?
Không. selectolax phân tích HTML mà bạn đã có; nó không có khách HTTP và không kết xuất JavaScript. Kết hợp nó với một lớp lấy — ở đây là API Cào Méo Universal Scrapeless, mà kết xuất trang ở phía máy chủ — và selectolax xử lý việc trích xuất từ byte trả về.
H: Tại sao sử dụng selectolax thay vì BeautifulSoup?
Tốc độ. selectolax bọc engine Lexbor dựa trên C, vì vậy việc phân tích và các truy vấn bộ chọn chạy trong mã đã biên dịch, điều này quan trọng khi khối lượng trang cao. Sự đánh đổi là bề mặt tính năng nhỏ hơn; cho việc trích xuất dựa trên bộ chọn trên nhiều trang, đó thường là sự đánh đổi đúng.
H: Sự khác biệt giữa css và css_first là gì?
css trả về danh sách tất cả các nút khớp với bộ chọn; css_first chỉ trả về kết quả khớp đầu tiên (hoặc một default mà bạn cung cấp). Sử dụng css để lặp qua các khối lặp lại như kết quả tìm kiếm, và css_first để lấy một trường đơn lẻ từ mỗi khối.
H: selectolax có xử lý các trang được render bằng JavaScript không?
Không, nó không tự thực thi các script. Nếu nội dung được tải sau HTML ban đầu, một lần fetch đơn giản sẽ đưa cho selectolax một cây rỗng. Fetch trang thông qua API Scrapeless với js_render trước, sau đó phân tích HTML đã render, như hướng dẫn này đã làm.
H: Việc scraping với selectolax có hợp pháp không?
Trình phân tích không thay đổi các quy tắc thu thập. Chỉ fetch các trang công khai, tôn trọng điều khoản của trang web và các chỉ thị robots được chuẩn hóa bởi Giao thức loại trừ Robots, giữ các khối lượng có giới hạn, và xử lý bất kỳ dữ liệu cá nhân nào theo các luật áp dụng cho bạn.
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.



