Xử lý phân trang và cuộn vô tận trong các trình thu thập dữ liệu
TL;DR
Phân trang có thể là một liên kết trang tiếp theo, URL được đánh số, API con trỏ, điều khiển Tải thêm, hoặc yêu cầu được kích hoạt bởi cuộn; kiểm tra nguồn dữ liệu thực tế trước khi viết một vòng lặp.
Dừng lại trên một tín hiệu đầu cuối ổn định: không có liên kết tiếp theo hoặc con trỏ, một tập hợp mục không thay đổi, giới hạn trang, hoặc sự kết thúc nguồn rõ ràng. Không sử dụng while True mà không có ranh giới.
Loại bỏ mục trùng lặp bằng một ID mục ổn định hoặc URL chính thống; các trang lặp lại và kết quả được sắp xếp lại thì bình thường trong các danh mục thay đổi.
Playwright có thể cuộn hoặc nhấp khi một trang web được phép thực sự cần tương tác với trình duyệt. Một API nguồn được tài liệu hóa thường dễ dàng hơn để kiểm tra.
Nstdata Crawl phát hiện các trang liên kết trong maxDepth, maxPages, quy tắc bao gồm và loại trừ, nhưng việc thu thập từ một trang không đảm bảo mọi mục chỉ cuộn đều.
Tại Sao Phân Trang Lại Gây Hỏng Các Trình Scraper Đang Hoạt Động?
Phân trang gây hỏng các công cụ scrap khi kịch bản xem phản hồi đầu tiên là toàn bộ bộ sưu tập hoặc đoán cách các kết quả khác được tải thêm. Một trang web có thể đặt <a rel="next"> trong HTML, cấu trúc các URL được đánh số, trả về một con trỏ từ một điểm cuối JSON, hoặc thêm thẻ sau một lần cuộn. Đây là các hợp đồng khác nhau. Kiểm tra bảng mạng của trình duyệt và tài liệu hóa phương thức truy cập được phép của nguồn trước khi triển khai một phương thức nào đó.
Đối với bộ sưu tập nhiều trang, Nstdata Crawl có thể phát hiện và lấy các URL được phép một cách đệ quy, trong khi quy tắc tiếp tục cụ thể theo nguồn vẫn cần được xác thực.
Thứ tự kết quả có thể thay đổi trong khi một lần thu thập diễn ra. Các mục mới có thể di chuyển các mục cũ hơn đến trang tiếp theo, gây ra trùng lặp hoặc thiếu sót. Sử dụng một khóa mục ổn định và một cửa sổ thu thập hoặc ảnh chụp nguồn khi API hỗ trợ một cái. Số trang là một chỉ dẫn điều hướng, không phải một danh tính cho các mục mà nó chứa.
Trải nghiệm Nstproxy Crawl - Bắt Đầu Dùng Thử Miễn Phí Hôm Nay
Bạn Cần Gì Trước Khi Bắt Đầu?
Chuẩn bị một nguồn đã được phê duyệt, một trang đầu tiên đã biết, bộ chứa mục và ID mục ổn định, cơ chế trang tiếp theo đã quan sát, và một ngân sách trang hoặc mục tối đa rõ ràng. Đối với các ví dụ liên kết dựa trên Python, cài đặt requests và Beautiful Soup. Đối với quy trình chỉ trên trình duyệt, cài đặt Playwright và nhị phân trình duyệt của nó. Giữ thông tin xác thực ra khỏi mã nguồn và tôn trọng các điều khoản và giới hạn tỷ lệ được tài liệu hóa của trang web.
Ghi lại page_url, fetched_at, next_url hoặc cursor, ID mục, và một dấu vân tay của tập hợp mục cho mỗi bước. Sổ cái đó làm rõ một trang bị kẹt hoặc lặp lại và hỗ trợ việc tiếp tục sau một sự cố. Một con trỏ được cung cấp từ nguồn nên được bảo tồn chính xác như đã trả về; không phát minh ra một con trỏ mới bằng cách tăng số trang.
Làm Thế Nào Để Bạn Theo Dõi Một Liên Kết Trang Tiếp Theo?
Sử dụng phương pháp này khi HTML trả về bao gồm một liên kết tiếp theo. Mã này là một mẫu cho một nguồn đã được phê duyệt; các bộ chọn phải được xác nhận trên trang trực tiếp.
Phương Pháp 1: Theo Dõi Phân Trang HTML
Bước 1. Xác định liên kết trỏ đến trang tiếp theo và một bộ chọn mục ổn định. Ưu tiên rel="next" khi trang web cung cấp nó, nhưng xác minh rằng nó trỏ đến danh sách dự định.
Bước 2. Lấy một trang tại một thời điểm, giải quyết các URL tương đối, và dừng lại khi không có hoặc lặp lại URL tiếp theo:
from urllib.parse import urljoin
import requests
from bs4 import BeautifulSoup
defpages(start_url, max_pages=10): seen_urls =set() url = start_url
with requests.Session()as session:for _ inrange(max_pages):if url in seen_urls:raise RuntimeError(f"Pagination loop at {url}") seen_urls.add(url) response = session.get(url, timeout=(5,20)) response.raise_for_status() soup = BeautifulSoup(response.text,"html.parser")yield response.url, soup
link = soup.select_one('a[rel="next"][href]')if link isNone:return url = urljoin(response.url, link["href"])
Bước 3. Trích xuất và loại bỏ ID mục trùng lặp từ mỗi trang đã được trả về. Lưu trang đã hoàn thành cuối cùng và URL tiếp theo đã phát hiện trước khi tiếp tục. Không suy diễn rằng một trang với ít thẻ hơn chắc chắn là trang cuối cùng; sử dụng tín hiệu đầu cuối thực tế của trang web.
Làm Thế Nào Để Bạn Xử Lý Một Con Trỏ Hoặc API Được Đánh Số?
Sử dụng API được tài liệu hóa của nguồn khi nó có sẵn và đã được phê duyệt. Một con trỏ là một mã thông báo tiếp tục không rõ ràng; truyền lại chính xác như đã nhận. Kiểm tra xem API có trả về một next_cursor, has_more, hoặc URL next rõ ràng hay không. Xác minh rằng một mã thông báo null hoặc không có thực sự có nghĩa là hoàn thành trong API đó. Đối với các trang được đánh số, sử dụng tham số quan sát của trang và giới hạn số trang.
Phương Pháp 2: Phân Trang Con Trỏ Kiểm Điểm
Bước 1. Lưu điểm cuối, các tham số cho phép, và một sơ đồ phản hồi ví dụ từ tài liệu nguồn hoặc bảng mạng.
Bước 2. Lấy một trang, xác thực mảng mục của nó, ghi lại các bản ghi đã chấp nhận một cách idempotently, sau đó bảo tồn con trỏ đã trả về. Một ghi phải hoàn tất trước khi con trỏ được tiến lên; nếu không, một sự cố có thể bỏ qua một trang.
Step 3. Dừng lại khi API báo cáo không tiếp tục, hoặc khi con trỏ và ID mục trả về lặp lại. Giới hạn tần suất yêu cầu và coi 429 như một tín hiệu để quay lui. Một con trỏ có thể hết hạn hoặc phụ thuộc vào một phiên; kế hoạch phục hồi của bạn nên chỉ ra liệu có nên khởi động lại từ một bản chụp đã biết hay không.
Phương pháp này thường dễ giám sát hơn so với cuộn trang web vì trạng thái tiếp tục là rõ ràng. Tài liệu tài liệu về nhện Scrapy cho thấy cách các trình phân tích có thể tạo ra các yêu cầu và mục tiếp theo như những kết quả riêng biệt.
Làm Thế Nào Để Bạn Thu Thập Cuộn Vô Hạn hoặc Tải Thêm?
Chỉ sử dụng tương tác trình duyệt khi nội dung thực sự được tải bởi trang và nguồn cho phép quy trình đó. Tài liệu hướng dẫn hoạt động của Playwright khuyến nghị cuộn một phần tử đã biết vào tầm nhìn khi hành động đó kích hoạt nội dung bổ sung. Tránh các vòng lặp scrollTo(0, document.body.scrollHeight) mù quáng: một trang web có thể thêm quảng cáo, sử dụng một container cuộn hoặc không bao giờ hiển thị chiều cao cuối.
Phương pháp 3: Tiến Bộ Danh Sách Trình Duyệt Với Một Vòng Lặp Bị Giới Hạn
Bước 1. Xác nhận container danh sách, thuộc tính ID mục, và một nút Tải Thêm hoặc một dấu hiệu gần đáy danh sách. Sử dụng một phần tử có thể tìm thấy, không phải là một giấc ngủ tùy ý, như điều kiện sẵn sàng. [Ảnh chụp màn hình: Container danh sách và điều khiển Tải Thêm hoặc dấu hiệu đáy trong trang đã đượcRendered.]
Bước 2. Trong mỗi vòng lặp, thu thập các ID mục hiển thị, thực hiện một lần nhấp hoặc hành động cuộn, sau đó chờ đợi một ID mới hoặc một trạng thái kết thúc đã được tài liệu. Đặt một số lần lặp tối đa và một thời gian chờ. Nếu tập hợp ID không phát triển, hãy dừng lại và chẩn đoán trang thay vì nhấp liên tục.
Bước 3. Lưu các mục mới chấp nhận và trạng thái danh sách quan sát. Một số danh sách ảo hóa loại bỏ các node DOM cũ trong khi cuộn; duy trì tập hợp seen_ids của riêng bạn thay vì coi số lượng DOM hiện tại như là sự bao phủ tổng thể.
Tài liệu tài liệu về bộ định vị Playwright hỗ trợ các bộ định vị dựa trên vai trò và văn bản và đợi tích hợp sẵn. Đối với một nguồn cho phép, vai trò nút ổn định và tên có thể truy cập thường dễ duy trì hơn so với một lớp CSS được tạo ra. Nếu trang web hiển thị các mục giống nhau qua một nguồn cấp chính thức, hãy ưu tiên nguồn đó và giữ lại đường dẫn trình duyệt chỉ để xác minh.
Nstdata Có Thể Giúp Thu Thập Các Trang Đa Trang Như Thế Nào?
Nstdata Crawl là một API Người Dò Web cho dữ liệu sẵn sàng cho LLM có thể biến một gốc trang đã được xem xét thành một tập hợp đủ giới hạn các bản ghi trang. Nó phát hiện các liên kết một cách đệ quy, xử lý việc kết xuất JavaScript và trả về các định dạng phù hợp cho việc phân tích tiếp theo hoặc tiếp nhận AI. Nó phù hợp cho các phần tài liệu liên kết, các trang danh mục và các bảng kê nội dung. Đối với một danh sách chỉ tồn tại phía sau trạng thái cuộn tùy chỉnh, hãy kiểm tra một trang đại diện và kiểm tra đầu ra trước khi giả định việc bao phủ hoàn toàn.
Đầu ra sẵn sàng cho LLM: Markdown cung cấp RAG và quy trình làm việc của tác nhân với văn bản rõ ràng hơn cùng với các tiêu đề và liên kết; HTML và dữ liệu thô duy trì cấu trúc cho việc trích xuất mục; các liên kết phơi bày điều hướng đã phát hiện; ảnh chụp màn hình và PDF giúp xác minh trạng thái đã Render. Sáu loại này được liệt kê trong tài liệu API Crawl.
Proxy tích hợp sẵn: Một công việc Crawl tiêu chuẩn kế thừa định tuyến được quản lý của Nstdata. Bạn cung cấp x-api-key và các tham số công việc, không có các trường proxy riêng biệt Host, Port, Username, Password, hoặc Protocol. Điều này đơn giản hóa việc thu nhận lặp đi lặp lại nhưng không phải là quyền vượt quá tần suất cho phép của một nguồn.
Điều khiển phạm vi:maxDepth, maxPages, includeUrls, và excludeUrls giữ cho việc phát hiện liên kết có giới hạn. Ứng dụng của bạn vẫn giải quyết các URL đã phát hiện với bảng kê mong đợi và kiểm tra các mục chỉ cuộn bị thiếu.
Làm Thế Nào Để Bạn Thêm Nstdata Crawl Vào Quy Trình Phân Trang?
Bước 1. Trong Bảng điều khiển → Khu chơi Crawl, kiểm tra trang danh sách đầu tiên đã được phê duyệt và lấy một khóa API. Quyết định xem danh sách có hiển thị các trang chi tiết liên kết hay không; nếu không, xác nhận hành vi cuộn một cách riêng biệt.
Bước 2. Gửi một công việc trang web đã giới hạn. Thay thế miền mẫu và các mẫu bằng phạm vi nguồn đã được phê duyệt:
curl--request POST 'https://api.nstdata.io/api/v1/crawl'\--header"x-api-key: ${NSTDATA_API_TOKEN}"\--header'Content-Type: application/json'\--data'{"url":"https://example.com/docs/","formats":["markdown","links"],"maxDepth":2,"maxPages":50,"includeUrls":["*example.com/docs/*"],"excludeUrls":["*example.com/account/*"]}'
Bước 3. Lưu lại ID quét trả về, hỏi GET /api/v1/crawl/status/{crawlId}, sau đó trang qua GET /api/v1/crawl/pages/{crawlId} sử dụng con trỏ trả về của nó. So sánh các URL phát hiện và ID mục đã chấp nhận với danh sách mong đợi từ nguồn. API đã tài liệu yêu cầu một khóa trực tiếp; đây là một ví dụ cấu hình, không phải là một cuộc quét trực tiếp đã được yêu cầu.
Đối với các danh sách có thay đổi cao, việc ghi lại các ID mục và chính sách xem xét lại quan trọng không kém cơ chế phân trang. Hướng dẫn phát hiện trang web đề cập đến các cách để đưa vào một kho URL, trong khi hướng dẫn thu thập tự động thảo luận về công việc định kỳ. Nstdata Cloud Browser là sản phẩm riêng có liên quan khi một quy trình được phê duyệt yêu cầu tiếp tục tương tác với trang.
Làm Thế Nào Để Xác Nhận Một Cuộc Quét Nhiều Trang Hoàn Thành?
So sánh số lượng mục đã chấp nhận và ID ổn định với tổng số hiển thị của nguồn hoặc số lượng API đã tài liệu khi có sẵn. Một số lượng tương ứng đơn lẻ là không đủ nếu các ID trùng lặp thay thế cho các ID bị thiếu. Xem xét trang đầu, giữa và cuối; xác nhận liên kết hoặc con trỏ tiếp theo cuối cùng; và kiểm tra mẫu các mục được thêm trong khi cuộc quét đang chạy. Đối với các danh sách thay đổi, ghi lại cửa sổ quét và chấp nhận rằng một bản chụp có thể yêu cầu một đợt đối chiếu lại thứ hai. Báo cáo độ phủ như một tập hợp đã đo, không phải là một tuyên bố không đủ “tất cả các trang”.