Cách Xây Dựng Trình Thu Thập Dữ Liệu Web Đạt Tiêu Chuẩn Sản Xuất với Scrapling và Scrapeless trong Python
Expert in Web Scraping Technologies
Những điểm chính:
- Scrapling cung cấp ba trình thu thập (fetcher) và bộ chọn thích ứng. Trình thu thập HTTP
Fetcher(với khả năng giả mạo TLS của trình duyệt),DynamicFetcherdựa trên Playwright, vàStealthyFetcherbao trùm các trang tĩnh, các trang được render bằng JavaScript, và bảo vệ chống bot trung bình trong một thư viện Python — và các bộ chọn thích ứng xác định các phần tử theo cấu trúc, không chỉ theo đường dẫn CSS dễ bị hỏng. - Quá trình nâng cấp là HTTP → stealth → trình duyệt đám mây. Bắt đầu với trình thu thập rẻ nhất hoạt động; khi tính năng stealth cục bộ gặp phải danh tiếng IP, các trình quản lý bot nâng cao, hoặc nội dung bị khóa theo địa lý, bạn có thể nâng cấp lên trình duyệt đám mây mà không cần viết lại mã phân tích.
- Việc tích hợp chỉ cần một dòng. Chỉ cần chỉ định trình thu thập Playwright của Scrapling vào một phiên Scrapeless qua CDP —
DynamicFetcher.fetch(url, cdp_url=session.browser_ws_endpoint)— và việc render, xuất proxy, và nhận diện vân tay đều diễn ra trên đám mây. - Scrapeless xử lý việc xuất và nhận diện vân tay. Trình duyệt Scraping của Scrapeless định tuyến qua các proxy dân cư ở hơn 195 quốc gia và ngẫu nhiên hóa vân tay của trình duyệt cho mỗi phiên, vì vậy trình duyệt đám mây render các trang mà một trình duyệt stealth cục bộ bị lọc.
- Bộ chọn thích ứng vượt qua sự thay đổi DOM. Scrapling có thể xác định lại một phần tử sau khi thay đổi bố cục bằng cách so khớp các thuộc tính và vị trí trước đó của nó, vì vậy một trình thu thập dữ liệu sẽ tiếp tục trả về hàng khi trang web mục tiêu thay đổi markup của nó.
- Miễn phí để bắt đầu. Các tài khoản Scrapeless mới bao gồm thời gian chạy Trình duyệt Scraping miễn phí — đăng ký tại Scrapeless.
Giới thiệu: Khi tính năng stealth cục bộ không còn khả thi
Các trang động, nặng JavaScript, được bảo vệ chống bot là nơi mà các trình thu thập HTTP đơn giản thất bại lặng lẽ. Một script requests + BeautifulSoup trả về HTTP 200 và một tập hợp kết quả trống rỗng: markup mà nó phân tích không bao giờ chứa dữ liệu, vì giá, danh sách, hoặc đánh giá được chèn vào bằng JavaScript sau phản hồi ban đầu. Trang web trông ổn trong một trình duyệt nhưng lại trống rỗng đối với trình thu thập dữ liệu của bạn.
Scrapling nâng cao nền tảng. Đây là một thư viện scraping Python nhanh với ba trình thu thập — một Fetcher HTTP giả mạo quá trình bắt tay TLS của một trình duyệt thực, một DynamicFetcher dựa trên Playwright để render JavaScript, và một StealthyFetcher thêm các bản vá stealth và xử lý Cloudflare — cộng với các bộ chọn thích ứng chịu được các thay đổi DOM. Điều đó bao gồm các trang tĩnh và một lượng lớn bảo vệ chống bot trung bình. Nhưng một trình duyệt chạy trên máy tính xách tay của bạn vẫn mang một IP trung tâm dữ liệu hoặc IP tại nhà với danh tiếng đã biết, và các trình quản lý bot nâng cao nhận diện tự động hóa bất kể độ sạch của tính năng stealth ở mức trang. Lúc đó, trang web sẽ được render cho con người và gặp thử thách cho bạn.
Hướng dẫn này xây dựng một pipeline Python gồm hai cấp. Cấp 1 là Scrapling một mình — công cụ phù hợp cho các trang tĩnh và được bảo vệ trung bình. Cấp 2 định tuyến DynamicFetcher của Scrapling qua Trình duyệt Scraping của Scrapeless qua CDP, nên việc render xảy ra ở phía đám mây thông qua các proxy dân cư và việc nhận diện vân tay chống phát hiện theo phiên trong khi mã phân tích Scrapling của bạn vẫn giữ nguyên. Đối với nguyên thủy Trình duyệt Scraping Scrapeless tương tự được điều khiển qua một khung đại lý thay vì một trình thu thập, hãy xem bài viết tích hợp LangChain.
Những gì bạn có thể xây dựng
Mô hình hai cấp — các trình thu thập Scrapling ở phía trước, Trình duyệt Scraping Scrapeless ở phía sau quá trình nâng cấp — bao quát hầu hết các công việc mà một trình thu thập HTTP thông thường không thể thực hiện:
- Theo dõi giá và tồn kho trên các cửa hàng SPA. Render các trang sản phẩm của ứng dụng trang đơn mà giá được cập nhật qua một XHR thứ hai, sau đó trích xuất các số liệu mà Scrapling phân tích từ DOM đã render.
- Trích xuất bên cạnh SERP. Kéo các khối kết quả hữu cơ và đoạn trích từ các trang kết quả kiểu tìm kiếm được gửi bằng JavaScript, sau đó phân trang qua chúng với các bộ chọn thích ứng.
- Danh sách khách hàng từ các thư mục JavaScript. Đi qua các trang danh sách doanh nghiệp và thành viên mà render hàng tại phía khách hàng, và thu thập các trường liên hệ vào các bản ghi kiểu.
- Ảnh chụp cụ thể theo địa lý qua xuất dân cư. Ghi lại các danh sách, giá cả, hoặc khả năng mà một người dùng địa phương sẽ thấy bằng cách ghim quốc gia proxy của Scrapeless, thay vì bất kỳ IP văn phòng nào mà bạn đang sử dụng.
- Tiếp nhận RAG của các trang đã render. Render các trang nhà xuất bản và tài liệu để làm sạch nội dung cho một pipeline nhúng, vì vậy lớp truy xuất sẽ lập chỉ mục những gì trang thực sự hiện, thay vì một bộ khung trống.
- Các trình thu thập vững chắc chịu được thay đổi bố cục. Dựa vào các bộ chọn thích ứng của Scrapling để một trình thu thập theo lịch trình vẫn tiếp tục trả về hàng sau khi trang web mục tiêu tráo đổi DOM của nó, thay vì thất bại lặng lẽ trong lần chạy tiếp theo.
- Trích xuất nhắm mục tiêu khó khăn phía sau chống bot nâng cao. Nâng cấp cùng mã Scrapling lên Trình duyệt Scraping Scrapeless khi một trang đã nạp một trình quản lý bot nâng cao mà stealth cục bộ không thể xóa bỏ.
Tại Scrapeless, chúng tôi chỉ truy cập dữ liệu công khai có sẵn trong khi tuân thủ nghiêm ngặt các luật lệ, quy định và chính sách quyền riêng tư của trang web. Nội dung trong bài viết này chỉ dành cho mục đích minh họa.
Tại sao nên kết hợp Scrapling với Scrapeless
Scrapling xử lý phân tích, ergonomics của trình thu thập dữ liệu và bộ chọn thích ứng; Trình duyệt thu thập dữ liệu Scrapeless xử lý việc né tránh mà một trình duyệt địa phương không thể làm được. Hai công cụ này kết hợp với nhau một cách suôn sẻ vì việc chuyển giao là một điểm cuối CDP duy nhất.
- Trình duyệt đám mây chống phát hiện. Trình duyệt thu thập dữ liệu Scrapeless chạy trên Chromium tự phát triển với khả năng kết xuất JavaScript đầy đủ ở phía đám mây, vì vậy SPAs, nguồn cấp dữ liệu cuộn vô hạn và các bảng điều khiển tải chậm được làm nóng trước khi Scrapling phân tích chúng.
- Proxy dân cư tại 195+ quốc gia. Đặt
proxy_countrykhi bạn tạo một phiên làm việc và trình duyệt đám mây sẽ xuất ra từ các địa chỉ IP dân cư thật trong khu vực mà bạn nhắm đến, vì vậy các trang web bị ràng buộc địa lý sẽ trả về những gì người dùng địa phương thấy. - Ngẫu nhiên hóa dấu vân tay theo phiên. Mỗi phiên sẽ nhận được một dấu vân tay ngẫu nhiên — user agent, múi giờ, WebGL và canvas — vì vậy các lần chạy lặp lại sẽ không bị gộp lại thành một danh tính có thể phát hiện.
cdp_urlthay thế. Truyền điểm cuối phiên Scrapeless dưới dạngcdp_urlchoDynamicFetcher.fetch(...)và không có gì khác trong API của Scrapling thay đổi — cùng selectors, cùng đối tượng kết quả, cùng mã phân tích.- Duy trì phiên qua
session_ttl. Giữ một phiên mở qua nhiều lần tải trang bằng cách đặtsession_ttlkhi tạo, để cookie ấm và trạng thái điều hướng duy trì giữa các yêu cầu trong một lần chạy duy nhất.
Thời gian chạy miễn phí để bắt đầu và mở rộng theo mức sử dụng — xem giá cả của Scrapeless để biết các bậc, và nhận khóa API của bạn trên gói miễn phí tại Scrapeless.
So sánh Scrapling với requests, BeautifulSoup và Scrapy
Nếu stack hiện tại của bạn là requests + BeautifulSoup hoặc Scrapy, đây là nơi Scrapling thích hợp và những gì thay đổi khi trình duyệt đám mây Scrapeless nằm phía sau.
| Công cụ | Kết xuất JavaScript | Chống bot / ẩn danh | Độ bền của bộ chọn | Tốt nhất cho |
|---|---|---|---|---|
requests + BeautifulSoup |
Không | Không (HTTP thô) | Thủ công; bị hỏng khi thiết kế lại | Các trang tĩnh nhỏ và API JSON |
| Scrapy | Chỉ qua các addon (ví dụ: tích hợp Playwright) | Không tích hợp sẵn | Thủ công; bị hỏng khi thiết kế lại | Các tập crawl lớn mà bạn tự tạo và lưu trữ |
Scrapling — Fetcher |
Không | Giả mạo TLS của trình duyệt | Bộ chọn thích ứng khả dụng | Lấy dữ liệu tĩnh nhanh với HTTP nhận thức dấu vân tay |
Scrapling — DynamicFetcher / StealthyFetcher |
Có (trình duyệt địa phương) | Bản vá ẩn danh, xử lý Cloudflare | Bộ chọn thích ứng | Các trang JS và chống bot trung bình, trên máy của bạn |
Scrapling + Scrapeless (cdp_url) |
Có (trình duyệt đám mây) | Proxy dân cư tại 195+ quốc gia + dấu vân tay theo phiên | Bộ chọn thích ứng | Các trang nặng JS, bị ràng buộc địa lý, hoặc chống bot khó khăn ở quy mô lớn |
Sự tiến triển là cộng dồn. Giữ requests/BeautifulSoup ở nơi mà nó đã hoạt động, sử dụng các trình thu thập dữ liệu của Scrapling khi một trang cần một trình duyệt hoặc HTTP nhận thức dấu vân tay, và định tuyến Scrapling qua Trình duyệt thu thập dữ liệu Scrapeless qua cdp_url khi việc kết xuất địa phương bị lọc. Mã phân tích — page.css(...), page.xpath(...) — vẫn giống nhau trong cả ba công cụ.
Điều kiện tiên quyết
Trước khi bắt đầu, hãy đảm bảo bạn đã có:
- Python 3.10+ — Scrapling 0.4.8 yêu cầu phiên bản này.
- pip — để cài đặt các gói bên dưới.
- Một tài khoản Scrapeless và khóa API — đăng ký gói miễn phí tại Trang web Scrapeless, sau đó lấy khóa của bạn từ Cài đặt → Quản lý khóa API.
- Sự quen thuộc cơ bản với bộ chọn CSS/XPath và terminal — bạn sẽ sử dụng cả hai để thu thập trang và lấy giá trị ra khỏi chúng.
Cài đặt
Bạn chỉ cần hai gói: Scrapling để thu thập và phân tích, và SDK chính thức của Scrapeless để tạo các phiên trình duyệt đám mây.
1. Cài đặt Scrapling và SDK Scrapeless
bash
pip install "scrapling[fetchers]" scrapeless
scrapling install # thu thập các trình duyệt địa phương cho DynamicFetcher / StealthyFetcher (bỏ qua nếu bạn chỉ sử dụng trình duyệt đám mây Scrapeless từ cdp_url)
scrapling[fetchers] cung cấp lớp thu thập và phân tích (các lớp Fetcher, DynamicFetcher, và StealthyFetcher cộng với một API bộ chọn giống như parsel), trong khi scrapeless là SDK chính thức tạo các phiên Trình duyệt thu thập dữ liệu Scrapeless và cung cấp cho bạn một điểm cuối CDP để kết nối.
2. Đặt khóa API của bạn trong Scrapeless
Xuất khóa của bạn để SDK có thể đọc:
bash
export SCRAPELESS_API_KEY=your_api_token_here
Trên Windows, sử dụng setx SCRAPELESS_API_KEY "your_api_token_here" (vĩnh viễn, shell mới) hoặc $env:SCRAPELESS_API_KEY="your_api_token_here" (phiên PowerShell hiện tại). SDK Scrapeless tự động đọc biến này — bạn không cần phải truyền khóa trong mã.
3. Kiểm tra cài đặt
Xác nhận môi trường bằng cách nhập ba fetcher và lấy một vài giá trị từ một trang tĩnh:
python
from scrapling.fetchers import Fetcher, DynamicFetcher, StealthyFetcher
page = Fetcher.get("https://quotes.toscrape.com/")
print(page.status, len(page.css("span.text::text")), "quotes") # -> 200 10 quotes
Nếu bạn thấy 200 10 quotes, Scrapling đã được cài đặt và phân tích đúng cách, và bạn đã sẵn sàng kết nối với Scrapeless Scraping Browser.
Bước 1 — Ba fetcher của Scrapling
Scrapling cung cấp ba fetcher mà đổi lấy tốc độ để tránh bị phát hiện. Nguyên tắc chung là chọn cái nhẹ nhất mà trả về dữ liệu bạn cần, sau đó tăng mức chỉ khi một yêu cầu bị chặn hoặc trả về trống: bắt đầu với Fetcher cho HTTP thông thường, chuyển sang DynamicFetcher khi trang cần JavaScript để hiển thị, và dùng StealthyFetcher khi có lớp chống bot ngăn cản.
| Fetcher | Engine | Sử dụng khi |
|---|---|---|
Fetcher |
HTTP qua curl_cffi (giả lập TLS trình duyệt) |
Trang tĩnh và API JSON — không cần JavaScript |
DynamicFetcher |
Playwright | Trang được render bằng JS, SPAs, nội dung tải lười |
StealthyFetcher |
Stealth Playwright | Phòng thủ chống bot như interstitials Cloudflare |
Cả ba đều nhập từ cùng một module và trả về phản hồi giống như parsel, vì vậy API lựa chọn (.css(...), .xpath(...)) là giống nhau bất kể fetcher nào tạo ra trang.
python
from scrapling.fetchers import Fetcher
# Lấy nội dung HTTP với giả lập TLS trình duyệt; trả về một Response giống như parsel.
page = Fetcher.get("https://books.toscrape.com/", impersonate="chrome", stealthy_headers=True)
title = page.css("article.product_pod h3 a::attr(title)") # -> tiêu đề cuốn sách đầu tiên
python
from scrapling.fetchers import DynamicFetcher
# Playwright render JS, sau đó trả về trang đã được cấp nước như một Response giống như parsel.
# Cần một trình duyệt cục bộ (chạy `scrapling install`) hoặc một trình duyệt từ xa qua cdp_url (bước tiếp theo).
page = DynamicFetcher.fetch("https://quotes.toscrape.com/js/", network_idle=True)
quotes = page.css("span.text::text") # -> các trích dẫn được render bằng JS, giờ đây có thể nhìn thấy
python
from scrapling.fetchers import StealthyFetcher
# Stealth Playwright cố gắng tiến hành bắt tay chống bot, sau đó trả về trang.
page = StealthyFetcher.fetch("https://example.com/protected-page",
solve_cloudflare=True, block_webrtc=True, hide_canvas=True)
content = page.css("main ::text") # -> nội dung trang khi thử thách được giải quyết
Bước 2 — Thêm một proxy (và nơi cục bộ trở nên vô ích)
Một địa chỉ IP từ trung tâm dữ liệu là một trong những điều đầu tiên mà một người quản lý bot xác định. Chuyển hướng yêu cầu thông qua các proxy dân cư cắt giảm các chặn uy tín IP này vì địa chỉ ra đi trông giống như một kết nối gia đình thông thường. Mỗi fetcher của Scrapling đều chấp nhận một proxy qua đối số proxy=, vì vậy bạn có thể thêm một mà không thay đổi phần còn lại của mã.
python
from scrapling.fetchers import Fetcher, StealthyFetcher
# Truyền một chuỗi proxy cho bất kỳ fetcher nào qua proxy=.
page = Fetcher.get("https://books.toscrape.com/",
proxy="http://<user>:<pass>@<host>:<port>")
# StealthyFetcher cũng chấp nhận đối số tương tự trong khi giải quyết thử thách chống bot.
page = StealthyFetcher.fetch("https://example.com/protected-page",
proxy="http://<user>:<pass>@<host>:<port>",
solve_cloudflare=True)
Đây là nơi Scrapeless phù hợp với câu chuyện proxy. Scrapeless cung cấp các proxy dân cư tại hơn 195 quốc gia, và có hai cách để đưa chúng vào trước Scrapling. Con đường đơn giản nhất áp dụng chúng ở cấp độ phiên trình duyệt đám mây: khi bạn kết nối DynamicFetcher với một phiên Scrapeless Scraping Browser, bạn ghim địa chỉ ra đi bằng proxy_country (được hiển thị ở bước tiếp theo) và không cần chạm tới chuỗi proxy nào cả. Scrapeless cũng cung cấp một sản phẩm proxy độc lập mà thông tin xác thực của nó được nhập thẳng vào đối số proxy= của Scrapling — xem giải pháp proxy Scrapeless để biết sản phẩm và docs.scrapeless.com để biết chuỗi gateway chính xác cần dán vào chỗ <user>:<pass>@<host>:<port> ở trên.
Một proxy tốt giải quyết vấn đề uy tín IP, nhưng không giải quyết tất cả. Các trình duyệt stealth cục bộ vẫn bị lọc bởi các quản lý bot tiên tiến và gặp khó khăn với JavaScript phía máy khách nặng, bất kể địa chỉ IP ra đi sạch đến đâu. Đó chính là nơi trình duyệt đám mây Scrapeless đảm nhiệm — được đề cập trong bước tiếp theo.
Bước 3 — Định tuyến Scrapling qua trình duyệt đám mây Scrapeless (cdp_url)
Khi chế độ ẩn địa phương hết — kết xuất nặng từ phía khách, một trình quản lý bot tiên tiến, hoặc một trang chỉ phân giải từ một quốc gia cụ thể — hãy mint một phiên làm việc Scrapeless với SDK và chuyển điểm cuối CDP của nó cho Scrapling. SDK sẽ mint phiên đó; Scrapling sẽ điều khiển nó. Proxy dân cư (proxy_country) và nhận diện trình duyệt được xử lý phía đám mây bởi Scrapeless Scraping Browser, vì vậy mã của Scrapling của bạn sẽ vẫn như cũ ngoài một tham số bổ sung: cdp_url.
python
from scrapeless import Scrapeless
from scrapeless.types import ICreateBrowser
from scrapling.fetchers import DynamicFetcher
client = Scrapeless() # đọc SCRAPELESS_API_KEY
session = client.browser.create(ICreateBrowser(proxy_country="US", session_ttl=240))
page = DynamicFetcher.fetch(
"https://quotes.toscrape.com/js/",
cdp_url=session.browser_ws_endpoint,
network_idle=True,
)
quotes = page.css("span.text::text")
authors = page.css("small.author::text")
session.browser_ws_endpoint là một URL CDP WebSocket có dạng wss://browser.scrapeless.com/browser?token=...&proxy... — Scrapling kết nối với nó chính xác như cách nó kết nối với một trình duyệt cục bộ. Sự khác biệt trước/sau là điều quan trọng: một Fetcher.get thông thường trên https://quotes.toscrape.com/js/ trả về 0 trích dẫn vì HTTP không thể thực thi JavaScript của trang, trong khi cùng một trang được lấy qua cdp_url của Scrapeless hiển thị 10 trích dẫn (cùng với các tác giả của chúng). Đây là hành vi của nền tảng, không phải là một mẹo điều chỉnh — trình duyệt đám mây thực thi JS, rồi Scrapling phân tích DOM kết quả.
StealthyFetcher.fetch(...) chấp nhận cdp_url với cùng một mẫu khi bạn muốn thêm lớp ẩn của Scrapling lên trên trình duyệt đám mây.
Bước 4 — Các bộ chọn thích ứng tồn tại khi DOM thay đổi
Các bộ chọn là phần yếu nhất của bất kỳ trình thu thập thông tin nào: một thiết kế lại đổi tên một lớp hoặc di chuyển một phần tử, và mỗi cuộc gọi css(...) sẽ lặng lẽ trả về không có gì. Chế độ thích ứng của Scrapling bảo vệ điều đó. Truyền adaptive=True (và tùy chọn adaptive_domain=...) vào lệnh lấy, Scrapling sẽ lưu lại dấu vân tay của mỗi phần tử bạn chọn. Khi DOM thay đổi, nó sẽ định vị lại phần tử đã lưu theo sự tương đồng thay vì theo một đường dẫn chính xác, vì vậy các bộ chọn của bạn sẽ tiếp tục hoạt động qua các thay đổi bố cục.
python
from scrapling.fetchers import DynamicFetcher
# Lần chạy đầu tiên: chọn bình thường; Scrapling ghi nhớ hình dáng của mỗi phần tử.
page = DynamicFetcher.fetch(
"https://quotes.toscrape.com/js/",
cdp_url=session.browser_ws_endpoint,
network_idle=True,
adaptive=True,
adaptive_domain="quotes.toscrape.com",
)
quotes = page.css("span.text::text")
# Sau đó, khi trang web thay đổi cấu trúc: chọn lại với cùng một lệnh gọi.
# Ngay cả khi "span.text" không còn phù hợp, chế độ thích ứng sẽ định vị lại phần tử đã lưu.
page = DynamicFetcher.fetch(
"https://quotes.toscrape.com/js/",
cdp_url=session.browser_ws_endpoint,
network_idle=True,
adaptive=True,
adaptive_domain="quotes.toscrape.com",
)
quotes = page.css("span.text::text")
Sử dụng các bộ chọn thích ứng trên các trang mà bạn lấy dữ liệu lặp đi lặp lại và mà thường xuyên thay đổi về hình thức — nó hấp thụ những biến động nhỏ của DOM để bạn chỉ cần xem xét lại các bộ chọn sau một lần thiết kế lại thực sự.
Bước 5 — Lấy nhiều trang trong một phiên đám mây
Hầu hết các công việc thực sự bao gồm hơn một URL — danh sách phân trang, kết quả tìm kiếm, cây danh mục. Việc tạo một trình duyệt đám mây mới cho mỗi trang sẽ khiến phiên làm việc ấm áp mất đi và phải thực hiện lại việc bắt tay kết nối mỗi lần. DynamicSession của Scrapling giữ một kết nối đơn lẻ đến trình duyệt đám mây Scrapeless mở và lấy từng trang thông qua đó, vì vậy cookie, danh tính dân cư, và trạng thái điều hướng sẽ được mang theo suốt quá trình thu thập.
python
from scrapeless import Scrapeless
from scrapeless.types import ICreateBrowser
from scrapling.fetchers import DynamicSession
client = Scrapeless()
session = client.browser.create(ICreateBrowser(proxy_country="US", session_ttl=300))
rows = []
with DynamicSession(cdp_url=session.browser_ws_endpoint) as crawler:
for n in range(1, 4): # các trang 1..3
url = "https://quotes.toscrape.com/js/" if n == 1 else f"https://quotes.toscrape.com/js/page/{n}/"
page = crawler.fetch(url, network_idle=True)
quotes = page.css("span.text::text")
authors = page.css("small.author::text")
rows += [{"quote": str(q), "author": str(a)} for q, a in zip(quotes, authors)]
print(len(rows), "dòng") # mười dòng trích dẫn cho mỗi trang sẽ được tích lũy ở đây
Mỗi trang sẽ tạo ra mười dòng trích dẫn, được tích lũy vào rows qua một phiên trình duyệt đám mây đã sử dụng lại. network_idle=True sẽ chờ cho mỗi trang được hoàn tất trước khi lấy dữ liệu; xem xét một trang ngắn hoặc rỗng là tín hiệu thử lại thay vì là kết thúc của danh sách. Đối với một quá trình từ danh sách đến chi tiết, hãy lấy danh sách trước, thu thập các URL chi tiết với page.css("a::attr(href)"), và sau đó lấy từng cái qua cùng một crawler — phiên làm việc dân cư và dấu vân tay sẽ giữ nguyên trong toàn bộ quá trình.
Bước 6 — Củng cố cho sản xuất
Chuyển từ một kịch bản làm việc sang một công việc đáng tin cậy chủ yếu liên quan đến áp lực ngược và hồi phục. Một vài quy tắc chịu phần lớn trọng lượng:
- Giới hạn độ đồng thời. Giữ ở mức ≤3 phiên trình duyệt đám mây trên mỗi máy chủ. Bất cứ điều gì vượt quá sẽ dẫn đến giới hạn tốc độ và kết nối bị đặt lại, và thông lượng biên hiếm khi bù đắp cho những lần thất bại bổ sung.
- Thử lại các lỗi kết nối tạm thời với thời gian chờ. Các lỗi hầm và lỗi hết thời gian như
ERR_TUNNEL_CONNECTION_FAILEDvốn có bản chất tạm thời. Bắt chúng, chờ theo cách hồi tiếp theo cấp số nhân và thử lại — đừng coi một lần kết nối thất bại là một trang chết. - Xoay vòng ra ngoài với
ProxyRotator.ProxyRotatorcủa Scrapling luân phiên các proxy trong các yêu cầu để bạn không công kích một mục tiêu từ một địa chỉ IP; kết hợp nó với proxy khu dân cư Scrapeless cho công việc gắn liền với địa lý. - Tái sử dụng một phiên qua các bước. Tạo ra một lần với
session_ttl(ví dụ: 240 giây) và truyền cùng mộtbrowser_ws_endpointqua quy trình nhiều bước — đăng nhập, điều hướng, trích xuất — thay vì phải trả tiền để khởi động một trình duyệt mới cho mỗi yêu cầu. - Xem các trường vắng mặt như nullable. Các trang thực tế có thể bỏ qua đánh giá, tác giả hoặc giá cả trên một số hàng. Mặc định cho các bộ chọn bị thiếu là
Nonethay vì khẳng định chúng tồn tại, vì vậy một bản ghi thưa thớt không làm sụp đổ quá trình.
Nhận khóa API của bạn trên gói miễn phí: Scrapeless
Những gì bạn nhận lại
json
[
{
"quote": "Thế giới mà chúng ta đã tạo ra là một quá trình suy nghĩ của chúng ta. Nó không thể được thay đổi mà không thay đổi cách suy nghĩ của chúng ta.",
"author": "Albert Einstein"
},
{
"quote": "Chính những lựa chọn của chúng ta, Harry, cho thấy chúng ta thực sự là ai, hơn nhiều so với khả năng của chúng ta.",
"author": "J.K. Rowling"
},
{
"quote": "Chỉ có hai cách để sống cuộc đời của bạn. Một là như thể không có gì là một phép màu. Cách khác là như thể mọi thứ đều là phép màu.",
"author": "Albert Einstein"
}
]
// Hình dạng phản ánh việc trích xuất Bước 3; các giá trị là ví dụ minh họa.
Một vài quan sát chân thực từ việc chạy quy trình này:
- Các trang render bằng JS cần trình duyệt đám mây. Một yêu cầu HTTP đơn giản đến
https://quotes.toscrape.com/js/trả về 0 hàng; chỉ có trình duyệt đám mây, truy cập quacdp_url, thực thi JavaScript để Scrapling có thể phân tích. network_idle=Truechờ hydration. Nó giữ cho đến khi mạng ổn định, điều này quan trọng trên các trang lấy nội dung của chúng sau lớp sơn đầu tiên.- Bộ chọn thích ứng giảm thiểu sự hỏng hóc, không phải xác minh. Chúng hấp thụ sự thay đổi nhỏ trong DOM, nhưng sau một thiết kế lớn, bạn vẫn nên chạy lại việc khám phá bộ chọn và xác nhận đầu ra.
- Ghim
proxy_countrycho các trang gắn liền với địa lý. Giá cả, tính khả dụng, và tường đồng ý khác nhau theo vùng; đặtproxy_countrygiúp giữ cho kết quả nhất quán với vùng bạn đang nhắm đến. - Trang tĩnh không cần bất kỳ điều gì trong số này. Nếu
Fetcher.getđã trả về dữ liệu, hãy sử dụng nó — nâng cấp lên trình duyệt đám mây chỉ khi HTTP trả về trống hoặc bị chặn. - Lỗi hầm tạm thời và lỗi 5xx có thể thử lại. Một lần
ERR_TUNNEL_CONNECTION_FAILEDhay 500 thường chỉ là tiếng ồn mạng, không phải lỗi trong mã của bạn — thử lại với thời gian chờ.
Kết luận: Fetcher nhẹ nhất trước, trình duyệt đám mây khi bị chặn
Quy trình rút gọn thành ba bước. Chọn fetcher nhẹ nhất mà hoạt động — Fetcher.get cho HTML tĩnh. Nâng cấp lên Trình Duyệt Scraping Scrapeless bằng cách truyền session.browser_ws_endpoint cho cdp_url của Scrapling vào thời điểm một trang trở về trống, bị chặn hoặc gắn liền với địa lý. Sau đó phân tích với bộ chọn thích ứng để việc trích xuất tồn tại qua sự thay đổi bố cục tiếp theo. Bạn chỉ trả tiền cho trình duyệt đám mây khi thực sự cần — xem giá Scrapeless để biết những gì nằm trong gói miễn phí — và phần còn lại của mã của bạn vẫn là Scrapling thuần túy.
Từ đây, mô hình cdp_url giống nhau có thể cắm vào các hệ thống lớn hơn. Xem hướng dẫn LangChain + Scrapeless để kết nối việc render đám mây vào một tác nhân, và hướng dẫn chi tiết về trình thu thập Etsy tại đây để xây dựng trang web hoàn chỉnh. Trước khi bạn phát hành: xuất SCRAPELESS_API_KEY, ghim proxy_country cho bất kỳ trang gắn khu vực nào, giữ độ đồng thời ở mức ≤3 phiên trên mỗi máy chủ, và xem các trường vắng mặt dưới dạng nullable.
Câu hỏi thường gặp
Việc thu thập dữ liệu trên web có hợp pháp không?
Việc thu thập dữ liệu công khai có sẵn thường được phép ở nhiều khu vực, nhưng luật pháp không đồng nhất. Xem lại Điều khoản Dịch vụ của mỗi trang, tránh thu thập dữ liệu cá nhân hoặc dữ liệu bản quyền mà bạn không có quyền, và nhớ rằng các quy tắc khác nhau theo khu vực. Khi còn nghi ngờ, hãy xin lời khuyên pháp lý cho trường hợp cụ thể của bạn.
Bạn có cần một proxy không?
Đối với bất kỳ thứ gì ở quy mô lớn, có. Việc thoát cư dân cắt giảm mạnh các khối so với các địa chỉ IP trung tâm dữ liệu, và điều này là bắt buộc cho các trang web mà khóa nội dung theo khu vực. Scrapeless cung cấp proxy dân cư ở hơn 195 quốc gia — đặt proxy_country khi bạn tạo một phiên, hoặc định tuyến qua cổng proxy — vì vậy bạn không phải tự tìm kiếm và xoay vòng các địa chỉ IP.
Khi nào bạn cần trình duyệt đám mây so với Scrapling cục bộ?
Hãy giữ lại chế độ cục bộ khi Fetcher.get trả về dữ liệu — đó là con đường nhanh nhất. Tăng cường lên trình duyệt đám mây Scrapeless thông qua cdp_url khi trang nặng về JavaScript phía client, được điều khiển bởi một trình quản lý bot tiên tiến, hoặc bị giới hạn theo địa lý. Trình duyệt đám mây chạy JS và áp dụng chống phát hiện cùng với thoát cư dân mà một lần lấy cục bộ không thể so sánh được.
Tại sao bạn vẫn thấy ERR_TUNNEL_CONNECTION_FAILED hoặc lỗi 5xx?
Thử lại. Đó là lỗi kết nối tạm thời, không phải lỗi trong kịch bản của bạn. Đóng gói việc lấy dữ liệu trong một vòng lặp thử lại với sự quay lại theo cấp số nhân và giới hạn hợp lý; hầu hết những lỗi này sẽ rõ ràng trong lần thử thứ hai hoặc thứ ba.
Các bộ chọn của tôi đã hỏng sau khi thiết kế lại trang. Làm thế nào để bạn khắc phục điều đó?
Bật các bộ chọn thích ứng (adaptive=True với adaptive_domain=...) để Scrapling định vị lại các phần tử đã lưu thông qua sự thay đổi DOM nhỏ. Sau khi thiết kế lại lớn, hãy chạy lại việc khám phá bộ chọn của bạn để xác nhận mã đánh dấu mới, sau đó để chế độ thích ứng giữ lại đường biên.
Có giới hạn đồng đẳng nào mà bạn nên tôn trọng không?
Giữ nó ở ≤3 phiên trình duyệt đám mây mỗi máy chủ. Ngoài ra, bạn sẽ phải đổi một chút thông lượng cho rất nhiều hạn chế tốc độ và việc thiết lập lại kết nối. Sử dụng đồng đẳng có giới hạn và một hàng đợi thay vì bắn mỗi yêu cầu một lần.
Scrapling cung cấp MCP riêng (pip install "scrapling[ai]") — điều này liên quan gì đến điều này?
Bạn có thể kết hợp cả hai. MCP của Scrapling cho một tác nhân AI quyền kiểm soát trực tiếp thư viện cục bộ; máy chủ MCP của Scrapeless cho tác nhân đó khả năng render đám mây với chống phát hiện và proxy cư dân. Sử dụng chúng cùng nhau, hoặc chọn cái phù hợp với công nghệ của bạn. Hướng dẫn này thực hiện theo con đường thư viện — Scrapling điều khiển trình duyệt đám mây Scrapeless thông qua cdp_url — giúp giữ cho việc tích hợp chỉ với một tham số và không cần bất kỳ máy chủ bổ sung nào để chạy.
Sẵn sàng Xây Dựng Dòng Dữ Liệu Được Hỗ Trợ AI Của Bạn?
Tham gia cộng đồng của chúng tôi để nhận kế hoạch miễn phí và kết nối với các nhà phát triển xây dựng các dòng dữ liệu Scrapling + Scrapeless: Discord · Telegram.
Đăng ký tại Scrapeless để nhận thời gian chạy Trình Duyệt Lấy Dữ Liệu miễn phí và điều chỉnh các mẫu ở trên theo các trang và khu vực mà dòng dữ liệu của bạn cần. Tham khảo đầy đủ tại docs.scrapeless.com.
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.



