Cách xây dựng một trình thu thập danh sách đáng tin cậy với Python và Nstproxy
Tóm tắt
Crawl danh sách trích xuất các bản ghi bị lặp lại qua một chuỗi trang được kiểm soát. Chuỗi này có thể sử dụng các trang số, liên kết tiếp theo, con trỏ, hành động tải thêm, hoặc hàng đợi URL đã cung cấp.
BeautifulSoup là lựa chọn rõ ràng nhất cho danh sách tĩnh nhỏ. Nó cho bạn kiểm soát trực tiếp, nhưng bạn phải thực hiện các yêu cầu, phân trang, thử lại, loại bỏ bản sao, điểm kiểm tra và xuất khẩu.
Scrapy là nền tảng Python mạnh mẽ hơn cho công việc nhiều trang lặp lại. Bộ lập lịch của nó, middleware thử lại, xuất khẩu dữ liệu, thống kê và công việc có thể tiếp tục loại bỏ mã hạ tầng mà không làm giảm việc duy trì bộ chọn.
Crawl Nstproxy phù hợp khi việc thu thập thông tin là vấn đề khó khăn hơn. Nó cung cấp khả năng khám phá có giới hạn, kết xuất JavaScript, định tuyến proxy và đầu ra trang trong khi đường ống của bạn vẫn giữ trách nhiệm về danh tính và xác thực mặt hàng.
Một sơ đồ không đảm bảo dữ liệu đúng. Sự chấp nhận sản xuất cũng nên kiểm tra nguồn gốc, tỷ lệ bản sao, độ hoàn thành trường cần thiết, điểm dừng phân trang và phân phối giá trị bất ngờ.
Giới thiệu: crawl danh sách là một vấn đề quản lý trạng thái
Crawl danh sách giống như một bài tập với bộ chọn cho đến khi thử lại đầu tiên, trang chồng chéo, thay đổi mẫu thầm lặng hoặc vòng lặp con trỏ vô hạn. Một crawler đáng tin cậy phải biết các trang nào đã được thử, các bản ghi nào đã được chấp nhận, lý do tại sao một bản ghi bị từ chối và nơi nào nên tiếp tục lại. Hướng dẫn này kiểm nghiệm hai phương pháp Python chống lại một sandbox thu thập thông tin công cộng, sau đó chỉ ra nơi Nstproxy Crawl có thể thay thế lớp truy cập và kết xuất.
Các ví dụ cố ý dừng lại sau hai trang. Chạy có giới hạn này đủ để xác minh bộ chọn và kiểm soát luồng mà không biến bài hướng dẫn thành một công việc thu thập toàn bộ trang không cần thiết.
Crawl danh sách là gì?
Crawl danh sách là việc phát hiện và trích xuất lặp đi lặp lại các bản ghi có dạng tương tự từ các trang danh sách hoặc hàng đợi URL đã định nghĩa trước. Các mục tiêu điển hình bao gồm lưới sản phẩm, danh bạ công khai, chỉ mục bài viết, lịch sự kiện và danh sách việc làm đã được ủy quyền. Mỗi bản ghi thường mang cả các trường kinh doanh và các trường nguồn gốc như , , , , và .
Trải nghiem Nstproxy - Bat dau dung thu mien phi ngay
item_id
detail_url
list_url
observed_at
crawl_run_id
Crawl danh sách kết hợp hai công việc nên vẫn tách biệt. Crawl tìm trang hoặc URL tiếp theo; scraping chuyển đổi mỗi trang thành các bản ghi. Sự phân biệt này được giải thích thêm trong scraping web so với crawling web.
Phân trang xác định hình dạng hàng đợi. Các trang số tiết lộ một chỉ mục, phân trang liên kết tiếp theo tiết lộ một chuỗi, API con trỏ tiết lộ trạng thái mờ đục, và cuộn vô hạn thường tiết lộ một yêu cầu nền hoặc hành động của trình duyệt. Từ điển phân trang đề cập đến các cơ chế này chi tiết hơn.
Tại sao crawl danh sách thất bại sau một bản demo thành công
Crawl danh sách thất bại trong sản xuất vì một trang đã tải xuống không giống như một bản ghi đã chấp nhận. Một phản hồi có thể trả về trạng thái thành công HTTP trong khi hiển thị màn hình đồng ý, lỗi mềm, giao diện ứng dụng trống hoặc trang lặp lại. Một trình phân tích cú pháp cũng có thể trả về văn bản hợp lý nhưng sai sau khi thay đổi bố cục.
Kiểm tra Python đầu tiên đã phơi bày một phiên bản nhỏ hơn của vấn đề này: thân của máy chủ đã khai báo UTF-8, nhưng việc giải mã ban đầu của Requests đã tạo ra mojibake ở tiền tệ và dấu câu. Thiết lập mã hóa phản hồi từ nội dung phát hiện đã sửa văn bản. Đó là loại khiếm khuyết mà một bộ đếm “bản ghi đã tìm thấy” bỏ qua.
Trước khi crawl, kiểm tra các điều khoản của trang web, chính sách đã công bố và các tùy chọn API chính thức. Tài liệu Giao thức loại trừ Robots của Google giải thích cách các quy tắc áp dụng cho một máy chủ, giao thức và cổng cụ thể. Các quy tắc của Robots điều chỉnh các tín hiệu truy cập của crawler; chúng không cấp quyền sử dụng lại dữ liệu cá nhân, bản quyền hoặc bị hạn chế.
Bạn nên chọn phương pháp crawl danh sách nào?
Chọn phương pháp theo trách nhiệm vận hành, không theo độ dài mã.
Khám phá trang web có giới hạn hoặc mục tiêu được nộp được dịch vụ xử lý
Trang JavaScript
Đòi hỏi một trình duyệt riêng
Đòi hỏi một tích hợp kết xuất
Kết xuất trình duyệt có sẵn như một tùy chọn crawl
Mô hình trích xuất
Phân tích CSS/nhãn bạn sở hữu
Phân tích CSS/XPath và các đường ống bạn sở hữu
Các đầu ra trang được quản lý; các bản ghi kinh doanh chính xác vẫn cần xác thực
Khởi động lại và khả năng quan sát
Xây dựng điểm kiểm tra và thống kê
Thống kê cộng với hỗ trợ công việc liên tục
Các bản ghi crawl và tiến trình nhiệm vụ được quản lý; trạng thái bản ghi phía hạ nguồn vẫn thuộc về bạn
Bề mặt bảo trì
HTTP, phân tích cú pháp, thử lại, lưu trữ
Bộ chọn, quy tắc nhện, quy trình, triển khai
Cấu hình thu thập dữ liệu, phân tích bản ghi, kiểm tra sơ đồ, và tích hợp nhà cung cấp
Phù hợp nhất
Danh sách tĩnh nhỏ và nguyên mẫu
Đột biến Python tái diễn với logic tùy chỉnh
Các trang nhạy cảm động hoặc nhạy cảm về truy cập nơi mà cơ sở hạ tầng trình thu thập dữ liệu là nút thắt
Tài liệu Beautiful Soup định nghĩa thư viện này là một công cụ phân tích cú pháp HTML/XML, không phải là một trình lập lịch hay tải xuống. Scrapy bao phủ nhiều hơn trong vòng đời thu thập dữ liệu. Nstproxy Crawl bao gồm thu thập thông tin, kết xuất, khám phá giới hạn, định tuyến, và đầu ra cấp trang, nhưng không nên được coi là một sự thay thế cho việc xác thực miền.
Hướng dẫn Chi tiết
Hướng dẫn này sử dụng https://books.toscrape.com/catalogue/page-1.html, một sandbox công cộng được xây dựng để thực hành thu thập dữ liệu. Cả hai phương pháp Python đều được thực hiện với các gói hiện tại và trả về 40 bản ghi độc đáo từ hai trang danh sách.
Phương pháp 1: thu thập danh sách tĩnh bằng BeautifulSoup
BeautifulSoup phù hợp khi các bản ghi và liên kết tiếp theo có sẵn trong HTML ban đầu và quá trình được thực hiện đủ nhỏ cho một quy trình.
Bước 1: cài đặt và định nghĩa hợp đồng bản ghi
Cài đặt requests và beautifulsoup4. Ví dụ giữ lại văn bản giá thô thay vì ép thành số vì phân tích cú pháp tiền tệ là một quy tắc miền riêng biệt. Nó rút ra một ID mặt hàng ổn định từ đường dẫn chi tiết chuẩn và giữ lại URL danh sách nguồn để theo dõi.
Tài liệu Requests khuyến nghị thời gian chờ rõ ràng cho các yêu cầu sản xuất và phân biệt giữa giải mã JSON thành công và phản hồi HTTP thành công. Kỷ luật tương tự áp dụng cho HTML.
Bước 2: theo liên kết tiếp theo và từ chối các trang lặp lại
import hashlib, json
from datetime import datetime, timezone
from urllib.parse import urljoin, urlsplit
import requests
from bs4 import BeautifulSoup
next_url ="https://books.toscrape.com/catalogue/page-1.html"max_pages =2session = requests.Session()session.headers["User-Agent"]="Nstproxy-list-crawl-tutorial/1.0"seen_items, seen_pages ={},set()run_time = datetime.now(timezone.utc).isoformat()pages =0while next_url and pages < max_pages: response = session.get(next_url, timeout=(5,20)) response.raise_for_status() response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text,"html.parser") cards = soup.select("article.product_pod")ifnot cards:raise RuntimeError(f"Không tìm thấy thẻ sản phẩm nào trên {response.url}") page_ids =[]for card in cards: link = card.select_one("h3 a[href]") detail_url = urljoin(response.url, link["href"]) parts =[p for p in urlsplit(detail_url).path.split("/")if p] record ={"item_id": parts[-2],"title": link["title"].strip(),"detail_url": detail_url,"list_url": response.url,"price_text": card.select_one("p.price_color").get_text(strip=True),"observed_at": run_time,} seen_items[record["item_id"]]= record
page_ids.append(record["item_id"]) fingerprint = hashlib.sha256("\n".join(sorted(page_ids)).encode()).hexdigest()if fingerprint in seen_pages:raise RuntimeError(f"Phát hiện trang lặp lại tại {response.url}") seen_pages.add(fingerprint) pages +=1 next_link = soup.select_one("li.next a[href]") next_url = urljoin(response.url, next_link["href"])if next_link elseNonefor record in seen_items.values():print(json.dumps(record, ensure_ascii=False))print({"pages": pages,"accepted_records":len(seen_items)})
Bước 3: diễn giải kết quả trước khi mở rộng
Chạy xác minh đã trả về {"pages": 2, "accepted_records": 40}. Điều đó chứng minh rằng các bộ chọn và truy cập liên kết tiếp theo đã hoạt động cho các trang mẫu. Nó không chứng minh rằng mọi trang sau sẽ có cùng một mẫu, rằng giá cả là hợp lệ về ngữ nghĩa, hoặc rằng một lần chạy trong tương lai sẽ giống nhau.
Trước khi tăng max_pages, hãy ghi bản ghi vào một bảng với ràng buộc tính duy nhất trên item_id, lưu lại trang hoàn thành cuối cùng sau khi cam kết thành công, và cảnh báo nếu độ hoàn chỉnh của trường bắt buộc hoặc số bản ghi trên trang thay đổi mạnh.
Phương pháp 2: chuyển hàng đợi sang Scrapy
Scrapy phù hợp khi bạn muốn có một trình lập lịch, middleware thử lại, xuất dữ liệu, thống kê thu thập dữ liệu, và một con đường đến các công việc bền vững trong khi vẫn giữ lại các bộ chọn và quy trình Python.
Bước 1: biểu diễn bản ghi và phân trang như đầu ra của nhện
Cài đặt scrapy, lưu nhện này và giữ hai trang bảo vệ trong quá trình xác thực:
from urllib.parse import urlsplit
import scrapy
classBookListSpider(scrapy.Spider): name ="book_list" start_urls =["https://books.toscrape.com/catalogue/page-1.html"] custom_settings ={
{"ROBOTSTXT_OBEY": đúng,"DOWNLOAD_DELAY":0.5,"CONCURRENT_REQUESTS_PER_DOMAIN":2,"RETRY_TIMES":2,"LOG_LEVEL":"THÔNG TIN"}def parse(self, response): cards = response.css("article.product_pod")
if không có cards: self.logger.error("Không tìm thấy thẻ sản phẩm trên %s", response.url)
return
cho từng card trong cards: detail_url = response.urljoin(card.css("h3 a::attr(href)").get())
parts = [p cho p trong urlsplit(detail_url).path.split("/") nếu p] yield {"item_id": parts[-2],"title": card.css("h3 a::attr(title)").get().strip(),"detail_url": detail_url,"list_url": response.url,"price_text": card.css("p.price_color::text").get().strip(),} page = int(response.url.rsplit("-",1)[-1].split(".")[0])
next_href = response.css("li.next a::attr(href)").get()
nếu next_href và page < 2: yield response.follow(next_href, callback=self.parse)
Để thực hiện một thử nghiệm xuất an toàn cho việc ghi đè
Chạy `scrapy runspider list_scrapy.py -O books.jl`. Chạy đã được xác minh sử dụng Scrapy 2.13.4, nhận được hai trang danh sách, xuất 40 bản ghi JSON Lines và hoàn thành bình thường. Yêu cầu bổ sung là `robots.txt` của trang web bị thiếu, đã trả về phản hồi không tìm thấy; quan sát đó thuộc về nhật ký chạy thay vì bị lặng lẽ bỏ qua.
Thêm khả năng tiếp tục và các cổng chất lượng dữ liệu
Đối với một trình thu thập thông tin theo lịch, hãy sử dụng thư mục công việc bền vững của Scrapy thay vì coi các tệp đầu ra như các điểm kiểm tra. Tài liệu <a href="https://docs.scrapy.org/en/latest/topics/jobs.html" rel="nofollow noopener"><strong>tài liệu công việc Scrapy</strong></a> mô tả cách tạm dừng và tiếp tục một lần thu thập thông tin với `JOBDIR` và cảnh báo rằng một thư mục phải thuộc về chỉ một công việc.
Thêm một pipeline mục để chuẩn hóa các trường, upsert theo `item_id`, và từ chối các giá trị bắt buộc bị thiếu. Xuất số liệu thống kê của nhện để giám sát. Một con nhện hoàn thành chỉ được xem là thành công trong hoạt động khi số lượng bản ghi được chấp nhận và phân bố các trường cũng vượt qua.
<div style="background-color: #f3f4f6; padding: 24px 40px; border-radius: 10px;">
<p style="font-weight: bold; font-size: 18px; margin-bottom: 10px;">
Nhìn Lướt Qua
</p>
<p style="margin-bottom: 24px;">
Kiểm tra một đường dẫn danh sách đại diện trong Nstproxy Crawl trước khi mở rộng giới hạn. So sánh tính đầy đủ của trang được hiển thị, các URL được phát hiện, và các bản ghi được chấp nhận tiếp theo với tiêu chuẩn Python.
</p>
<div style="text-align: center; margin-top: 10px;">
<a href="https://app.nstproxy.com/auth/login?utm_source=official&utm_medium=blog&utm_campaign=/list-crawling/" style="background: #1e4dff; color: #fff; padding: 10px 28px; border-radius: 38px; text-decoration: none; display: inline-block;">
Thiết Lập Nstproxy
</a>
</div>
</div>
### Phương pháp 3: Sử dụng Nstproxy Crawl để truy cập và hiển thị
[Nstproxy Crawl](https://www.nstproxy.com/scraping) là phù hợp khi hiển thị JavaScript, định tuyến proxy, khám phá có giới hạn, hoặc các hoạt động của trình thu thập thông tin tốn nhiều công sức hơn so với bộ phân tích bản ghi. Bề mặt sản phẩm hiện tại hỗ trợ một Playground và quy trình API, giới hạn độ sâu và trang, quy tắc bao gồm/điều chỉnh, hiển thị trình duyệt, tùy chọn proxy, cũng như đầu ra trang theo định dạng Markdown, HTML, JSON, liên kết, hoặc PDF. Tính phí dựa trên mức sử dụng theo URL đã thu thập thành công; các con số giá đã được cố ý bỏ qua vì chúng thay đổi. Đây là lựa chọn tốt cho các nhóm muốn việc lấy và khám phá trang được quản lý trong khi giữ logic lược đồ trong pipeline của họ. Không có lời hứa rằng mọi trang đều có thể truy cập hoặc rằng mọi trường được trả về đều chính xác.Bước 1: gửi một đường dẫn danh sách đại diện
Mở [Nstproxy Crawl](https://www.nstproxy.com/scraping) và bắt đầu với một URL danh mục hoặc thư mục công cộng. Sử dụng Playground trước khi tạo mã API. Tài liệu tổng quan về khởi động [Nstproxy Crawl](https://www.nstproxy.com/blog/nstproxy-crawl-launch) cung cấp thêm ngữ cảnh về quy trình làm việc.Bước 2: thiết lập giới hạn trước khi bật đệ quy
Đặt một số trang tối đa và độ sâu nhỏ, chỉ bao gồm các đường dẫn danh sách/chi tiết liên quan, và loại trừ giỏ hàng, tài khoản, lịch, các bản sao có yếu tố, và các tệp. Bật JavaScript chỉ nếu các bản ghi cần thiết không có trong HTML thô. Những lựa chọn này giới hạn sự mở rộng URL ngẫu nhiên và làm cho một lần chạy thử có thể giải thích được.
Bước 3: xác nhận đầu ra trang như là đầu vào, không phải sự thật
Chọn định dạng trang nhẹ nhàng nhất mà giữ lại các trường mà bộ phân tích của bạn cần. Sau đó áp dụng cùng các kiểm tra `item_id`, nguồn gốc, trùng lặp, và tính đầy đủ đã được sử dụng bởi các phương pháp Python. Từ điển [glossary dữ liệu có cấu trúc](https://www.nstproxy.com/glossary/structured-data) giải thích tại sao một hình dạng có kiểu là hữu ích, nhưng tính hợp lệ của kiểu vẫn không thể chứng minh rằng một giá trị thuộc về mục đúng.
Trang sản phẩm trực tiếp đã được xác thực cho hướng dẫn này, nhưng một cuộc thu thập xác thực đã không được thực hiện vì không có thông tin tài khoản nào có sẵn. Hãy xem phương pháp Nstproxy như một con đường hoạt động được tài liệu hóa cho đến khi phiên chạy đại diện của bạn vượt qua các cổng chấp nhận tương tự.
Những gì mà hầu hết các hướng dẫn thu thập danh sách bỏ qua
Việc thu thập danh sách sản phẩm cần có các trạng thái cuối cùng rõ ràng. Mỗi trang hoặc URL nên kết thúc là được chấp nhận, bị từ chối vĩnh viễn, hoặc có thể thử lại với một số lần cố định. "Không có liên kết tiếp theo" không đủ để đảm bảo: cũng nên dừng lại ở một con trỏ lặp lại, dấu vân tay trang lặp lại, giới hạn trang, hoặc thời hạn.
Xác thực lược đồ là cần thiết nhưng chưa đầy đủ. Một mô hình có thể chấp nhận một tiêu đề cú pháp hợp lệ nhưng được lấy từ thẻ sai, một mức giá mặc định được sao chép qua mỗi hàng, hoặc một thuộc tính trích xuất từ LLM không được hỗ trợ bởi trang. Lưu các trường chứng cứ, mẫu kết quả thô, và so sánh phân phối giữa các lần chạy.
Sử dụng các chỉ số chấp nhận này:
bản ghi ứng cử viên so với bản ghi đã chấp nhận;
hoàn thiện trường bắt buộc theo từng trường;
tỷ lệ trùng lặp sau khi chuẩn hóa;
thành công trang danh sách và thành công trang chi tiết riêng biệt;
các trang không thêm ID mục chưa thấy;
độ trễ tươi mới và mức sử dụng thu thập cho mỗi bản ghi đã chấp nhận.
Cũng hãy tách biệt khám phá danh sách khỏi làm giàu chi tiết. Nếu một trang chi tiết không thành công, hãy giữ lại bản ghi khám phá với trạng thái làm giàu. Nếu không, một thất bại trong làm giàu một phần có thể xóa bỏ chứng cứ rằng mục đó đã tồn tại.
Kết luận: chọn ranh giới sở hữu mà bạn có thể vận hành
BeautifulSoup là công cụ học tập rõ ràng nhất cho một danh sách tĩnh có giới hạn, trong khi Scrapy là nền tảng Python tốt hơn khi lịch trình, thử lại, xuất khẩu, và khả năng khôi phục là quan trọng. Chọn Nstproxy Crawl khi việc kết xuất trình duyệt, định tuyến proxy, và khám phá trang có giới hạn là điểm nghẽn hoạt động, sau đó giữ ID ổn định, xác thực, điểm kiểm tra, và các chỉ số chấp nhận trong lớp dữ liệu của bạn. Bắt đầu với hai trang đại diện, chứng minh hợp đồng bản ghi, và mở rộng chỉ sau khi trình thu thập có thể dừng lại và khôi phục một cách dự đoán.
Đối với các cuộc thu thập lặp lại kết hợp nhiều nguồn proxy và cần tính năng định tuyến tập trung, cũng đánh giá Nstproxy Proxy Manager.
Trải nghiệm Nstproxy — Bắt đầu dùng thử miễn phí hôm nay
Chạy một mẫu thu thập danh sách có giới hạn, so sánh nó với cơ sở Python của bạn, và mở rộng chỉ khi các bản ghi được chấp nhận — không chỉ là phản hồi trang — vượt qua đánh giá.
Q: Một trình thu thập danh sách có giống như một trình trích xuất web không?
Không. Một trình thu thập danh sách quản lý việc phát hiện trang hoặc URL và trạng thái, trong khi một trình trích xuất lấy thông tin; các quy trình thu thập danh sách thực tế thực hiện cả hai công việc.
Q: Tôi nên sử dụng BeautifulSoup hay Scrapy?
Sử dụng BeautifulSoup cho một quy trình tĩnh nhỏ nơi bạn muốn có kiểm soát rõ ràng, và sử dụng Scrapy khi lịch trình, thử lại, xuất khẩu, thống kê thu thập, và các công việc có thể khôi phục biện minh cho một khung làm việc.
Q: Một trình thu thập nên dừng phân trang như thế nào?
Kết hợp các tín hiệu: không có mã thông báo tiếp theo, không có ID mục chưa thấy, không có dấu vân tay lặp lại, và áp dụng giới hạn trang và thời gian. Một phản hồi trống nên được điều tra thay vì coi như là bằng chứng hoàn thành.
Q: Việc trích xuất dựa trên lược đồ có loại bỏ việc làm sạch dữ liệu không?
Không. Một lược đồ có thể áp đặt hình dạng và loại, nhưng bạn vẫn cần nguồn gốc, chuẩn hóa, loại bỏ trùng lặp, xác thực ngữ nghĩa, và giám sát độ lệch.
Q: Khi nào nên kích hoạt việc kết xuất trình duyệt?
Kích hoạt việc kết xuất trình duyệt chỉ khi các bản ghi cần thiết hoặc điều khiển phân trang còn thiếu trong HTML ban đầu và xuất hiện sau khi JavaScript được thực thi.
Q: Việc thu thập danh sách có hợp pháp không?
Tính hợp pháp phụ thuộc vào dữ liệu, quyền tài phán, phương pháp truy cập, điều khoản trang web, và mục đích sử dụng. Ưu tiên các API chính thức khi phù hợp, tôn trọng các điều khiển thu thập được công bố, giảm thiểu việc thu thập, và có được đánh giá pháp lý cho các trường hợp sử dụng nhạy cảm hoặc thương mại.
Hướng Dẫn Tối Ưu Để Thu Thập Dữ Liệu Amazon Năm 2026
Hướng dẫn từng bước năm 2026 để trích xuất dữ liệu sản phẩm từ Amazon -- giá cả, đánh giá, ASIN và kết quả tìm kiếm -- với mã code thực tế, cái nhìn tổng quan về việc sử dụng hợp pháp/đúng đắn liên quan đến API Quảng cáo Sản phẩm đã bị ngừng hoạt động của Amazon, và một Mẹo Thêm để biến một lần trích xuất thành một công cụ theo dõi giá liên tục với Nstproxy Crawl và Proxy Manager.
Lena Zhou
Aug. 17th 2026
110M+ IP that voi ti le truy cap thanh cong 99.9%
Phan hoi trung binh ~0.5s cho tac vu dong thoi cao
Chi tu $0.1/GB
Truy cap ngay cac pool proxy residential, datacenter, IPv6 va ISP cao cap.