Web Scraping with Python: Hướng Dẫn Toàn Diện 2026
TL;DR
Sử dụng requests và Beautiful Soup khi một trang được phép trả về dữ liệu cần thiết trong phản hồi HTML ban đầu.
Sử dụng một API Crawl quản lý hoặc trình render trình duyệt khi JavaScript tạo nội dung sau phản hồi ban đầu; phân tích một khung HTML rỗng sẽ không giải quyết được vấn đề render.
Đặt thời gian chờ, xác định khách hàng của bạn, điều chỉnh tốc độ yêu cầu theo nguồn, và xử lý các lỗi 429 và các lỗi có thể thử lại khác một cách rõ ràng.
Lưu URL nguồn, thời gian truy xuất, trạng thái phản hồi, phiên bản trình phân tích, và kết quả xác thực với mỗi bản ghi được trích xuất.
Nstdata Crawl cung cấp phát hiện trang web, crawl đệ quy, render JavaScript, nhiều loại đầu ra, và định tuyến proxy tích hợp sẵn; Python vẫn có trách nhiệm với việc phân tích và kiểm tra chất lượng ở đầu ra.
Bạn Cần Gì Trước Khi Scraping Một Trang Web Bằng Python?
Bạn cần Python 3, sự cho phép cho nguồn và cách sử dụng dự kiến, và một cách để kiểm tra phản hồi thực tế của trang. Tạo một môi trường ảo và cài đặt hai gói được sử dụng trong các ví dụ tĩnh: Sản phẩm Nstdata Crawl là một tùy chọn quản lý cho các bước thu thập và chuyển đổi được thảo luận ở đây.
Trải nghiệm Nstproxy Crawl - Bắt Đầu Dùng Thử Miễn Phí Hôm Nay
venv .venv
source
.venv/bin/activate
python
-m
pip
install
requests beautifulsoup4
Trên Windows PowerShell, kích hoạt với .venv\Scripts\Activate.ps1. Sử dụng bảng điều khiển mạng của trình duyệt để kiểm tra xem dữ liệu có xuất hiện trong phản hồi tài liệu, phản hồi API sau này, hay một DOM đã được render. Kiểm tra điều khoản của nguồn và các quy tắc robots áp dụng trước khi thu thập dữ liệu. Giao thức loại trừ Robots miêu tả các quy tắc truy cập crawler; nó không phải là một giấy phép nội dung.
Nếu bạn sử dụng Nstdata, bạn cũng cần một tài khoản và một khóa API. Header đã được tài liệu hóa là x-api-key. Yêu cầu Crawl quản lý không cần các giá trị Proxy Host, Port, Username, Password, hoặc Protocol riêng biệt.
Trình Scraper Web Python Thực Sự Hoạt Động Như Thế Nào?
Một scraper có bốn giai đoạn: yêu cầu, phân tích, xác thực, và duy trì. Giai đoạn yêu cầu lấy một phản hồi hoặc trang đã được render. Trình phân tích ánh xạ các phần tử trang tới các trường. Xác thực từ chối đầu ra thiếu hoặc không khả thi. Duy trì lưu trữ bản ghi đã được chấp nhận và đủ nguồn gốc để gỡ lỗi hoặc xóa nó. Kết hợp cả bốn trong một biểu thức làm cho các lỗi khó xác định.
HTML không phải là một sơ đồ cơ sở dữ liệu ổn định. Một bộ chọn CSS có thể bị hỏng khi một trang redesign một thẻ hoặc chèn một màn hình đồng ý. Cung cấp cho mỗi trình phân tích một phiên bản và kiểm tra nó với các mẫu trang đại diện. Đối với các lần chạy lặp lại, lưu một mẫu nhỏ của HTML thô hoặc đầu ra đã được render để bạn có thể phân biệt sự thay đổi nguồn với sự thoái lui mã.
Hướng dẫn Requests quickstart tài liệu hóa việc xử lý phản hồi và các tùy chọn yêu cầu được sử dụng trong phương pháp tĩnh.
Làm Thế Nào Để Bạn Scrape Một Trang Tĩnh Với Requests Và Beautiful Soup?
Sử dụng phương pháp này khi nội dung cần thiết có mặt trong HTML ban đầu. Ví dụ sử dụng example.com chỉ như một minh chứng kết nối và phân tích; thay thế nó bằng một nguồn đã được phê duyệt và các bộ chọn mà bạn đã kiểm tra.
Phương Pháp 1: Lấy và Phân Tích Một Trang HTML
Bước 1. Lấy trang với một thời gian chờ và một User-Agent thành thật.
Bước 2. Phân tích một trường tồn tại trong tài liệu trả về.
soup = BeautifulSoup(response.text,"html.parser")heading = soup.select_one("h1")if heading isNone:raise ValueError("Expected h1 was not found")record ={"source_url": response.url,"title": heading.get_text(" ", strip=True)}print(record)
Bước 3. Lưu kết quả với một dấu thời gian truy xuất và phiên bản trình phân tích. Trong sản xuất, cũng lưu trạng thái phản hồi và một hash nội dung. raise_for_status() sẽ bắt các lỗi HTTP, nhưng nó không thể cho biết liệu phản hồi 200 có phải là một trang đăng nhập hoặc một tường đồng ý.
Giới Hạn:requests không thực thi JavaScript trên trang. Một bộ chọn rỗng trên một trang JavaScript có thể có nghĩa là nội dung chưa bao giờ xuất hiện trong phản hồi HTTP.
Làm Thế Nào Để Bạn Trích Xuất Các Bản Ghi Lặp Lại Mà Không Trộn Lẫn Các Trường?
Giới hạn từng tìm kiếm trường vào một phần tử chứa. Việc chọn tất cả các tiêu đề và tất cả các giá chỉ một cách độc lập có thể ghép các giá trị sai khi các thẻ bị thiếu các phần tử.
Phương Pháp 2: Phân Tích Một Danh Sách Các Thẻ
Bước 1. Kiểm tra một trang đã được phê duyệt và xác định một bộ chọn container ổn định cùng với bộ chọn tiêu đề, giá cả và liên kết trong đó. Thay thế các bộ chọn ví dụ bên dưới bằng những bộ chọn quan sát trên trang đó.
Bước 2. Lặp qua các container và loại bỏ các bản ghi không đầy đủ.
from urllib.parse import urljoin
defparse_cards(html:str, page_url:str)->list[dict[str,str]]: soup = BeautifulSoup(html,"html.parser") items =[]for card in soup.select("article.product-card"): title = card.select_one(".product-title") price = card.select_one(".price") link = card.select_one("a[href]")ifnot(title and price and link):continue items.append({"title": title.get_text(" ", strip=True),"price_text": price.get_text(" ", strip=True),"url": urljoin(page_url, link["href"]),})return items
Bước 3. So sánh một mẫu bản ghi với trang. Giữ nguyên price_text cho đến khi bạn biết được ngôn ngữ và loại tiền tệ của trang; chuyển đổi giá trị hiển thị sang số quá sớm có thể làm mất ý nghĩa. Thêm một định danh sản phẩm ổn định nếu nguồn cung cấp một cái.
Giới hạn: Những bộ chọn này chỉ là minh họa, không phải bộ chọn cho example.com hoặc một lược đồ được hứa hẹn trên mọi cửa hàng.
Tài liệu Beautiful Soup mô tả hành vi bộ chọn và cây phân tích cho việc trích xuất trường.
Làm thế nào bạn có thể thu thập thông tin từ các trang JavaScript hoặc toàn bộ trang web?
Sử dụng một lớp kết xuất và thu thập thông tin khi HTML ban đầu thiếu nội dung hoặc khi bạn cần khám phá qua các trang liên kết. Nstdata Crawl có thể kết xuất JavaScript và phát hiện các trang theo cách đệ quy. Tài liệu Crawl API của nó cho thấy một điểm cuối đồng bộ cho một trang và một điểm cuối công việc trang web. Phản hồi là cụ thể cho nhà cung cấp; hãy kiểm tra nó trước khi ánh xạ đến lược đồ ứng dụng của bạn.
Bước 1. Đặt khóa API của bạn trong shell. Không bao giờ mã hóa cứng nó trong một kịch bản hoặc cam kết nó vào một kho lưu trữ.
exportNSTDATA_API_KEY="your-api-key"
Bước 2. Gửi một trang đã được phê duyệt và kiểm tra phản hồi JSON. Điểm cuối và tiêu đề theo tài liệu Nstdata hiện tại; kiểm tra chính xác các trường trong thân yêu cầu trong tài liệu trực tiếp của tài khoản bạn trước khi chạy.
Bước 3. Đối với một cuộc thu thập trang web, gửi một công việc /api/v1/crawl đã được tài liệu với maxDepth, maxPages, includeUrls, và excludeUrls giới hạn; sau đó kiểm tra trạng thái của nó và lấy các trang. Xác nhận mỗi trang trước khi chèn nó vào tập dữ liệu của bạn. Các đầu ra lớn có thể được tham chiếu bằng một mã lưu trữ thay vì xuất hiện trong dòng.
Giới hạn: Nstdata là một dịch vụ thu thập và chuyển đổi, không phải là một trình trích xuất lược đồ kinh doanh tùy ý. Mã Python của bạn vẫn quyết định các trường nào tạo thành một bản ghi được chấp nhận. Khóa là điều kiện tiên quyết cho một cuộc gọi trực tiếp; ví dụ trên không phải là một bài kiểm tra trực tiếp được tuyên bố.
Hướng dẫn thu thập có giới hạn thêm các điều kiện dừng và nhịp điệu nhận thức nguồn.
Tại sao một trình thu thập thông tin Python trả về dữ liệu trống hoặc không chính xác?
Triệu chứng
Nguyên nhân khả thi
Kiểm tra tiếp theo
Bộ chọn trả về None
Bộ chọn sai hoặc nội dung được kết xuất bằng JavaScript
Kiểm tra response.text và bảng mạng của trình duyệt
200 với văn bản không liên quan
Trang đồng ý, đăng nhập, hoặc trang lỗi
Kiểm tra tiêu đề và các phần tử trang cần thiết
429 hoặc thời gian chờ lặp lại
Tốc độ yêu cầu hoặc quá tải nguồn
Chậm lại, tôn trọng Retry-After, và kiểm tra quyền truy cập được phép
Bản ghi trùng lặp
Trang giống nhau qua các biến thể truy vấn hoặc phát hiện lặp lại
Định nghĩa một URL chuẩn và ID nguồn
Ký tự bị hỏng
Mã hóa phản hồi không đúng
Kiểm tra tiêu đề, byte, và charset tài liệu
Đừng lách luật kiểm soát truy cập để làm cho trình thu thập thông tin hoạt động. Nếu một nguồn yêu cầu xác thực hoặc hạn chế truy cập tự động, hãy sử dụng một API được phép, nhận được sự cho phép, hoặc chọn một nguồn khác.
Làm thế nào để bạn làm cho đầu ra đáng tin cậy đủ cho một sản phẩm AI?
Ghi lại source_url, fetched_at, parser_version, và một hash nội dung. Xác thực các trường bắt buộc, ngôn ngữ, loại trang, và các trang lỗi rõ ràng. Giữ các tài liệu thô và đã xử lý riêng biệt để có thể phát lại các sửa lỗi của trình phân tích. Đối với RAG, đính kèm URL nguồn và phiên bản tài liệu vào mỗi đoạn và kiểm tra xem câu trả lời có trích dẫn bản ghi hiện tại hay không. Đối với huấn luyện mô hình, thêm quyền và nguồn gốc vào bản danh mục tập dữ liệu.
Tài liệu Python urllib.robotparser mô tả một cách để đọc quy tắc robots, nhưng các quyết định chính sách và quyền hạn vẫn thuộc về ứng dụng. Khi chất lượng trang đơn lẻ ổn định, thêm độ đồng thời giới hạn và trạng thái công việc bền vững; hướng dẫn asyncio đi kèm đề cập đến bước đó.
Làm Thế Nào Để Kiểm Tra Một Trình Thu Thập Dữ Liệu Python Trước Khi Lập Lịch?
Xây dựng các mẫu xung quanh loại trang, không chỉ URL. Bao gồm một trang bình thường, một trường bị thiếu, một chuyển hướng, một lỗi HTTP, một trang đồng ý hoặc đăng nhập nếu có thể xuất hiện, và một shell JavaScript khi có liên quan. Lưu HTML nguồn ở một vị trí kiểm tra có kiểm soát và khẳng định rằng trình phân tích hoặc trả về một bản ghi hợp lệ hoặc một lý do từ chối rõ ràng. Một bài kiểm tra chỉ kiểm tra xem requests.get() có trả về 200 hay không sẽ bỏ lỡ các lỗi có khả năng làm ô nhiễm tập dữ liệu.
Tách biệt các bài kiểm tra lấy dữ liệu khỏi các bài kiểm tra trình phân tích. Một mẫu trình phân tích nên có thể phát lại mà không cần truy cập mạng để một thay đổi bộ chọn có thể được chẩn đoán nhanh chóng. Một bài kiểm tra khói trực tiếp nhỏ có thể xác nhận rằng nguồn hiện tại vẫn phù hợp với mẫu. Khi một trang web thay đổi, cập nhật mẫu và trình phân tích cùng nhau sau khi xem xét trang mới; đừng âm thầm làm yếu việc xác thực cho đến khi tất cả các trang đều vượt qua.
Đối với các phiên bản sản xuất, ghi lại số lượng theo nguồn và loại trang: đã gửi, đã lấy, đã từ chối, đã chấp nhận, đã thử lại, và các lỗi cuối cùng. Xem xét một mẫu đầu ra đã chấp nhận và đã từ chối sau mỗi lần triển khai. Tỷ lệ chấp nhận cao không tự động tốt nếu bộ xác thực chấp nhận các banner cookie như các bài viết.
Làm Thế Nào Để Chọn Giữa Python Cục Bộ Và API Thu Thập Quản Lý?
Chọn lấy dữ liệu cục bộ cho các trang tĩnh ổn định khi đội ngũ của bạn có thể sở hữu tốc độ yêu cầu, thử lại, trích xuất, và vận hành. Chọn kết xuất quản lý hoặc thu thập khi trang phụ thuộc vào JavaScript, khi cần phát hiện trên toàn bộ trang web, hoặc khi việc bảo trì trình duyệt và mạng có thể làm phân tâm khỏi lược đồ sản phẩm. Kiểm tra cả hai con đường trên cùng một mẫu được ủy quyền và so sánh các bản ghi đã chấp nhận, nỗ lực chẩn đoán, và độ trễ đầu cuối.
Trong cả hai trường hợp, ứng dụng Python nên xác định hợp đồng dữ liệu cuối cùng. Đối với một cơ sở tri thức AI, hợp đồng đó có thể là tiêu đề tài liệu, URL chính, nội dung Markdown, đường dẫn tiêu đề, và dấu thời gian nguồn. Đối với dữ liệu thương mại, nó có thể là ID sản phẩm, biến thể, tiền tệ, giá hiển thị, tính khả dụng, và URL bằng chứng. Đầu ra trang sang JSON tổng quát chỉ là một điểm khởi đầu nếu những trường kinh doanh đó chưa được xác thực.
Bắt đầu với một mẫu, chứng minh dữ liệu là chính xác, sau đó thêm các trang và độ đồng thời. Nếu một nguồn cung cấp một luồng hoặc API đã được tài liệu hóa phù hợp với cách sử dụng, hãy đánh giá nó trước khi phân tích HTML. Nó có thể cung cấp các định danh ổn định hơn và tín hiệu thay đổi hơn một trang web, trong khi vẫn yêu cầu xem xét giấy phép và cách sử dụng.
Q: Beautiful Soup có đủ cho các trang được kết xuất bằng JavaScript không?
Không. Beautiful Soup phân tích HTML mà nó nhận được; nó không thực thi JavaScript. Sử dụng một con đường kết xuất nếu nội dung cần thiết không có trong phản hồi ban đầu.
Q: Nstdata có trả về đúng lược đồ sản phẩm của tôi không?
Không. Nstdata trả về nội dung trang và các tài liệu hỗ trợ. Ứng dụng của bạn ánh xạ và xác thực các trường cần thiết cho sản phẩm của nó.
Q: Tôi nên lưu trữ điều gì với mỗi hàng được trích xuất?
Lưu trữ URL nguồn, thời gian thu thập, phiên bản trình phân tích, trạng thái xác thực, và ít nhất một hash nội dung.
Hướng dẫn Python này di chuyển từ một trang tĩnh đến các bản ghi đã được xác thực và việc quản lý việc hiển thị. Nó bao gồm các ví dụ có thể chạy, chẩn đoán lỗi, kiểm soát nguồn và một hợp đồng dữ liệu sẵn sàng cho AI.
Marcus Chen
Oct. 29th 2026
Thu thập toàn bộ trang web chỉ với một yêu cầu API
Tỷ lệ thành công 99,8% với kết xuất JavaScript
Nhận dữ liệu sạch, sẵn sàng cho LLM ở nhiều định dạng
Chuyển mọi trang web thành Markdown, HTML, JSON, liên kết, PDF và hơn thế nữa mà không cần quản lý hạ tầng thu thập dữ liệu.