Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
R rvest web scraping trích HTML và giữ trường thiếu

R rvest web scraping trích HTML và giữ trường thiếu

Chuyên viên Kỹ thuật ProxyVN 05-17-2026 Đang tính... phút đọc

R rvest web scraping nên tách bước tải trang khỏi bước chọn node. Duyệt từng card giúp giữ tên và giá cùng sản phẩm khi một trường thiếu; fixture offline giúp kiểm lỗi trước khi thêm mạng. ProxyVN hướng dẫn anh em dựng ví dụ nhỏ, kiểm đầu vào và đối chiếu từng lớp trước khi mở rộng tác vụ.

R rvest web scraping và phạm vi triển khai

rvest đọc và truy vấn cây HTML để tạo bảng hoặc vector trong R. Bài này tách tải HTTP bằng httr2 khỏi xử lý HTML bằng rvest. Proxy thuộc request tải trang; selector chỉ nhìn nội dung đã nhận được.

Tệp HTML lưu trên đĩa có thể được parse mà không có mạng. Cách làm này giúp kiểm selector với đầu vào cố định trước khi thêm proxy, timeout và phân trang. Nếu cùng file tạo bảng sai ở cả direct lẫn proxy thì lỗi nằm trong dữ liệu hoặc phép trích.

html_elements có thể trả số node khác nhau cho từng selector. Trích toàn bộ tên rồi trích toàn bộ giá sẽ lệch hàng khi một sản phẩm thiếu giá. Hãy duyệt từng card và lấy từng trường trong phạm vi card đó.

Anh em có thể đối chiếu chữ ký API và tùy chọn trong tài liệu chính thức của công cụ. Phần ví dụ dưới là cách triển khai minh họa cho lab; tài liệu API không thay thế kết quả chạy trên một bộ phiên bản cụ thể.

R rvest web scraping chuẩn bị môi trường và dữ liệu

Tạo fixture catalog.html gồm hai article.product, mỗi article có data-id, h2 và a. Chỉ article đầu có span.price. Cài rvest và tibble theo môi trường R của dự án. Ví dụ offline sau không tải mạng và không cần proxy.

Một phép thử hữu ích bắt đầu bằng đầu vào có thể kiểm soát. Anh em nên dùng một hostname lab, một đường dẫn trả nội dung cố định và một mã nhận diện cho từng lượt chạy. Khi kết quả khác kỳ vọng, ba thông tin này giúp tìm đúng dòng log thay vì đoán nguyên nhân từ thông báo cuối cùng.

Tạo một thư mục thử riêng, giữ mã nguồn và lockfile cùng nhau. Ghi phiên bản hệ điều hành, runtime, package và backend TLS nếu có. Lần chạy hôm nay và lần chạy sau có thể dùng cùng mã nhưng khác dependency; thiếu hồ sơ phiên bản sẽ làm phép so sánh khó tái lập.

Địa chỉ trong ví dụ là biến cấu hình, không phải dịch vụ đã được cấp. Anh em cần điền endpoint được phép sử dụng và gateway có thật trong môi trường của mình. Không dùng địa chỉ minh họa để đánh giá tình trạng hoạt động của một sản phẩm.

Chọn một dữ liệu mẫu nhỏ đủ bao phủ tình huống bình thường và một tình huống lỗi. Với API, đó có thể là một object hợp lệ và một object thiếu trường. Với HTML, đó là hai record, trong đó một record thiếu giá. Với browser, đó là một trang có trạng thái ban đầu và trạng thái sau thao tác.

Giữ một bản dữ liệu gốc trước khi chuẩn hóa. Thời điểm tải, URL cuối và loại nội dung là metadata của nguồn; chúng không nên bị trộn vào trường nghiệp vụ. Cấu trúc này giúp nhận ra khi response thực tế là trang đăng nhập hoặc trang lỗi dù mã HTTP vẫn thành công.

Đặt tiêu chí đạt trước khi chạy. Một request hoàn tất chưa đủ nếu nhiệm vụ là trích hai record, giữ cookie độc lập hoặc tải một artifact mới. Ghi rõ số record mong đợi, trường bắt buộc và dấu hiệu tuyến mạng tương ứng để kết luận dựa trên điều kiện đã định.

Môi trường thử nên có phạm vi cấu hình nhỏ. Cấp biến môi trường cho tiến trình hoặc lệnh cần dùng, tránh sửa proxy toàn máy khi đang kiểm một thư viện. Các ứng dụng khác có thể dùng cấu hình hệ thống và tạo request ngoài phạm vi phép thử.

Nếu tác vụ cần thông tin xác thực, dùng tài khoản lab có thời hạn và quyền vừa đủ. Tên biến có thể xuất hiện trong mã nguồn; giá trị bí mật không nên nằm trong file bài viết. Trước khi chụp log hoặc gửi hỗ trợ, kiểm cả URL vì userinfo và query cũng có thể chứa credential.

Chuẩn bị môi trường

Chuẩn bị môi trường

R rvest web scraping ví dụ tối thiểu

Ví dụ bắt đầu từ một tác vụ nhỏ để anh em nhìn rõ ranh giới của công cụ. Các biến môi trường cần được cấp ở máy thử; tên file fixture phải tồn tại trước khi chạy. Kết quả mong đợi là điều kiện để tự kiểm, chưa phải số liệu đã đo trên một gateway thương mại.

library(rvest)
library(tibble)
 
doc <- read_html("catalog.html")
cards <- html_elements(doc, "article.product")
rows <- lapply(cards, function(card) {
  tibble(
    id = html_attr(card, "data-id"),
    name = html_text2(html_element(card, "h2")),
    price_raw = html_text2(html_element(card, ".price")),
    href = html_attr(html_element(card, "a"), "href")
  )
})
result <- do.call(rbind, rows)
stopifnot(nrow(result) == 2)
print(result)

html_element trên một trường thiếu tạo kết quả thiếu cần được giữ thành NA theo hành vi API, thay vì xóa cả sản phẩm. Bảng kết quả phải vẫn có hai dòng. Không thay giá thiếu bằng số 0 nếu hợp đồng không nói đó là giá thật.

Khi lấy HTML online, dùng httr2 request có req_proxy và timeout, kiểm status rồi truyền nội dung cho bước parse. Giữ URL cuối sau redirect để chuẩn hóa href tương đối. read_html trên URL có thể tự tải trang, nhưng sẽ làm mờ ranh giới tải và parse của bài lab này.

read_html xử lý HTML tĩnh. Với dữ liệu tạo bởi JavaScript, kiểm raw response và API công khai được phép trước khi chọn giải pháp browser. Không công bố benchmark giữa parser khi chưa cố định fixture và đo trên cùng môi trường.

R rvest web scraping quản lý dữ liệu và trạng thái

Parser không thể khôi phục dữ liệu chưa có trong HTML đầu vào. Trước khi sửa selector, tìm một giá trị mong đợi trong raw response hoặc fixture. Nếu giá trị chỉ xuất hiện sau JavaScript, bài toán đã có thêm tầng thực thi hoặc cần một nguồn dữ liệu khác được phép sử dụng.

Thiết kế record từ container ra trường. Chọn một card, một hàng bảng hoặc một khối bài viết trước, rồi trích các trường bên trong. Cách này giữ tên, giá và link cùng một sản phẩm ngay cả khi một trường thiếu. Trích nhiều danh sách toàn trang rồi ghép theo vị trí dễ tạo dữ liệu sai mà không có exception.

Phân biệt ba trạng thái của trường: không có node, có node nhưng text rỗng và có text không chuyển được kiểu. Chúng có thể cần ba mã chất lượng dữ liệu khác nhau. Gộp tất cả thành chuỗi rỗng khiến người vận hành không biết nguồn thiếu dữ liệu hay quy tắc parse đã thay đổi.

Lưu giá trị raw trước khi chuẩn hóa tiền tệ, ngày tháng và đơn vị. Một dấu chấm có thể là phân cách thập phân hoặc hàng nghìn tùy nguồn. Chọn quy tắc theo hợp đồng của website hoặc API, rồi viết fixture cho từng biến thể; không thay mọi dấu chấm một cách toàn cục.

URL tương đối phải được giải theo base của tài liệu thực nhận. Redirect, thẻ base hoặc thư mục hiện tại có thể thay kết quả. Sau khi chuẩn hóa URL, kiểm scheme và phạm vi host trước khi lên lịch tải; một link trong DOM không tự cấp quyền crawl mọi nơi nó trỏ tới.

Encoding cần được xử lý ở đúng tầng. Giữ bytes tải về cùng metadata charset khi chẩn đoán, sau đó giải mã có chủ đích. Chạy nhiều lần các hàm thay ký tự trên chuỗi đã hỏng thường làm mất dấu vết nguyên nhân và có thể sửa sai những ký tự đang đúng.

Một fixture tốt có lỗi nhỏ có chủ đích. Thêm một card thiếu giá, một tên có thẻ con, một link tương đối và một ký tự entity. Mỗi biến thể nên có output mong đợi rõ ràng. Không cần hàng nghìn record để phát hiện một phép ghép sai phạm vi selector.

Kiểm số record trước khi xuất file. Nếu selector trả không có gì, xác nhận nguồn thực sự rỗng hay cấu trúc trang đã đổi. Nếu source có id, dùng id làm khóa so trùng giữa các trang. Không lấy việc tạo được một file CSV làm tiêu chí duy nhất của thành công.

Giữ schema đầu ra ổn định qua ca thiếu dữ liệu. CSV rỗng vẫn cần header; JSONL cần kiểu trường nhất quán; list nhiều giá trị không nên bị biến thành một chuỗi mơ hồ. Đọc lại file vừa xuất giúp phát hiện vấn đề escape, encoding và chuyển kiểu trước khi đưa vào phân tích.

Benchmark parser phải tách tải mạng, khởi động runtime và parse. Dùng cùng bytes, cùng bộ selector và kiểm output giống nhau. Một công cụ trả nhanh vì bỏ qua record lỗi không thể được xem là nhanh hơn trong cùng nhiệm vụ. Không ghi bảng xếp hạng khi chưa thực hiện phép đo này.

Để kiểm thêm lớp trạng thái HTTP, đọc hướng dẫn cookie của MDN. Cookie có phạm vi riêng; một file HTML lưu trên đĩa chỉ là dữ liệu đầu vào, không đại diện cho toàn bộ phiên đã tải tài liệu đó.

Công cụ và dữ liệu

Công cụ và dữ liệu

R rvest web scraping xác minh đường đi

Tuyến direct là đối chứng về khả năng tiếp cận nguồn, không phải bằng chứng proxy đang lỗi hay đang tốt. Chạy cùng endpoint, cùng nội dung yêu cầu và cùng tiêu chí dữ liệu. Chỉ đổi cấu hình mạng trong phép so này; đổi đồng thời selector, token và gateway sẽ làm kết quả mất khả năng giải thích.

Đường qua gateway có thêm một bên trung gian và có thể thêm bước xác thực hoặc tunnel. Cần xác định lỗi xảy ra trước khi tới proxy, tại proxy hay sau khi proxy đã kết nối origin. Mỗi vị trí đòi hỏi cách sửa khác nhau và không thể được nhận diện chỉ bằng một nhãn lỗi chung.

Với HTTPS đích qua HTTP proxy, client thường yêu cầu mở tunnel rồi mới thiết lập TLS tới origin. Gateway dùng HTTP không có nghĩa nội dung HTTPS của origin được gửi dưới dạng HTTP thuần. Tuy vậy, chính kết nối tới gateway và cơ chế xác thực của nó vẫn phải được đánh giá theo môi trường triển khai.

IP quan sát tại origin là một bằng chứng về tuyến, nhưng không mô tả toàn bộ trạng thái ứng dụng. Hai phiên khác nhau có thể dùng cùng IP; một phiên có thể đi qua cơ chế thay IP tùy gateway. Vì thế ghi riêng request ID, session ID đã che và nhãn cấu hình thay vì đồng nhất chúng với nhau.

Header tự gửi như X-Forwarded-For không phải bằng chứng về IP kết nối. Origin cần ghi peer address từ tầng mạng hoặc dùng thông tin từ reverse proxy đáng tin theo hạ tầng của nhóm. Không tự thêm header rồi dùng giá trị đó để báo gateway đã được xác minh.

Hostname cũng phải được xét từ nơi request thực sự phát sinh. Máy chạy browser, worker container và laptop điều khiển có thể có DNS khác nhau. Một hostname mở được trên laptop chưa chứng minh node từ xa kết nối được tới cùng origin hoặc gateway.

Bypass cần ca kiểm dương và ca kiểm âm. Host nội bộ được chọn phải đi tuyến direct đúng dự kiến, trong khi một host ngoài danh sách vẫn phải qua proxy. Nếu chỉ kiểm host nội bộ mở được, một cấu hình vô tình bỏ proxy cho mọi host vẫn có thể bị nhận nhầm là đạt.

Sau redirect, kiểm URL cuối cùng trước khi đọc dữ liệu. Redirect có thể đổi hostname, giao thức hoặc trang đích sang form đăng nhập. Hợp đồng tải nên nêu rõ có cho theo redirect hay không và phạm vi host được phép, thay vì coi mọi trang trả về là nguồn dữ liệu mong muốn.

Nếu cần rà đầu vào, dùng hướng dẫn định dạng proxy để kiểm cấu trúc URL trước khi thử kết nối. Quy tắc bỏ qua proxy cũng cần được đối chiếu với cú pháp riêng của thư viện, vì các runtime có thể hiểu danh sách host khác nhau.

Kiểm cấu hình, kiểm đường đi và kiểm dữ liệu là ba bước riêng. Một bước đạt chưa thay thế bằng chứng của hai bước còn lại.

R rvest web scraping bộ ca kiểm có đối chứng

Các ca dưới đây là kế hoạch kiểm trên ứng dụng hoặc nguồn dữ liệu được phép. Thực hiện theo thứ tự, giữ đầu vào giống nhau khi so hai cấu hình và lưu trạng thái từng ca. Nếu thiếu runtime, gateway hoặc fixture tương ứng, ghi chưa chạy thay vì suy kết quả từ tài liệu.

Card thiếu giá

Bỏ span.price ở sản phẩm B nhưng giữ id và tên. Bảng giữ B, price_raw thiếu và không kéo giá của A sang B.

Đây là ca cơ sở để khóa đầu vào. Ghi tên cấu hình, phiên bản và mã lượt chạy trước khi mở rộng. Nếu ca cơ sở chưa đạt, dừng so hiệu năng và giữ log lỗi đầu tiên; thêm nhiều tác vụ sẽ chỉ tạo thêm biến số khó tách.

Tên có thẻ con

Đặt em hoặc strong bên trong h2 của một card. Tên lấy từ text DOM thay vì giữ markup HTML.

Giữ phần còn lại của môi trường như ca trước để phép so có ý nghĩa. Lưu cả kết quả quan sát và điều kiện mong đợi vào hai trường riêng. Một mô tả kết quả khác kỳ vọng thường hữu ích hơn nhãn thất bại đơn lẻ khi người khác cần tái lập.

Khoảng trắng

Thêm xuống dòng và khoảng trắng giữa các phần tên. Quy tắc html_text2 cho đầu ra dự kiến trên fixture.

Kiểm nguyên nhân bằng dữ liệu ở lớp tương ứng. Không sửa đồng thời secret, URL và logic xử lý chỉ để lượt sau chạy qua. Sau mỗi thay đổi nhỏ, chạy lại đúng ca này và đối chiếu request hoặc record bằng mã nhận diện đã giữ.

Liên kết tương đối

Dùng href /item/a và ../item/b trong hai ca. URL cuối dùng base URL thực tế của tài liệu.

Bổ sung một assertion về nội dung hoặc trạng thái, thay vì chỉ kiểm chương trình không ném lỗi. Nếu công cụ trả về đối tượng hợp lệ nhưng thiếu giá trị nghiệp vụ, ca này vẫn chưa đạt. Giữ bản input nhỏ để assertion có thể kiểm lại offline khi phù hợp.

Không có card

Trả HTML hợp lệ nhưng thiếu article.product. Tác vụ báo schema trang thay đổi, không gọi đó là catalog rỗng nếu chưa xác nhận.

Đối chiếu nhánh lỗi với một nhánh bình thường đã biết. Ghi rõ khác biệt đến từ dữ liệu, cấu hình hay môi trường. Khi hết phép thử, hoàn nguyên biến đã thay để ca kế tiếp không kế thừa một trạng thái lỗi được tạo có chủ đích.

HTML tải qua proxy

Lưu body đã tải bằng httr2 rồi parse file đó. Bảng khớp cùng fixture offline và gateway log chứng minh tuyến.

Chỉ giới hạn thay đổi trong môi trường lab và đặt thời hạn kết thúc hữu hạn. Lỗi được tạo có chủ đích phải có nhãn riêng để không bị đưa vào thống kê sự cố vận hành. Sau ca này, kiểm tác vụ và tài nguyên còn sống trước khi chuyển bước.

Giá có đơn vị

Giữ chuỗi 1.250.000 đ trước bước chuyển kiểu. Chuyển đổi locale được kiểm độc lập với selector.

Giữ đầu ra gốc khi đánh giá kết quả đã chuẩn hóa. Nếu cần che thông tin, che trên bản sao bàn giao và ghi phương pháp che. Đừng xóa metadata cần thiết để truy ngược một request hoặc record rồi vẫn nhận phép thử có thể tái lập.

Bảng xuất

Xuất CSV UTF-8 và đọc lại bằng R. Số dòng, cột và chữ Việt còn nguyên sau round trip.

Chạy lại một ca cơ sở sau khi hoàn nguyên để kiểm môi trường đã trở về trạng thái dự kiến. Lưu kết quả cuối cùng cùng thời điểm kết thúc. Việc dọn tài nguyên thuộc điều kiện kết thúc bài thử, không phải một bước tùy hứng sau khi đã báo thành công.

Kiểm theo từng ca

Kiểm theo từng ca

R rvest web scraping phân loại lỗi và cách xử lý

Phân loại lỗi theo lớp giúp giảm số lần thử không cần thiết. Không có response HTTP thường hướng tới DNS, TCP, TLS, timeout hoặc thành phần runtime. Có response HTTP thì cần đọc status, loại nội dung và bên thực sự trả response trước khi sửa dữ liệu ứng dụng.

Mã 407 chỉ ra yêu cầu xác thực proxy theo giao thức HTTP. Mã 401 thường liên quan danh tính tại origin. Tuy nhiên, giao diện thư viện có thể bọc lỗi tunnel vào exception; vì vậy lưu loại exception và thông báo đã che bí mật, đừng ép mọi lỗi vào một cột status bằng số.

Mã 403 không tự chứng minh IP nằm trong một danh sách chặn. Nguồn có thể từ chối theo quyền truy cập, token, tuyến URL hoặc chính sách ứng dụng. Cách xử lý là đối chiếu yêu cầu với hợp đồng nguồn và log lab, thay vì đổi gateway liên tục mà không có giả thuyết.

Mã 429 cần được xem cùng cơ chế giới hạn và thời gian chờ mà server cung cấp. Giảm tần suất và tôn trọng hướng dẫn của nguồn. Proxy không làm quota theo tài khoản biến mất; một token vẫn có thể chịu cùng giới hạn dù đi qua nhiều tuyến.

Lỗi parse cần được phân tích trên body đã lưu. Nếu body là HTML lỗi còn chương trình chờ JSON, sửa bước kiểm response trước parser. Nếu bytes đúng nhưng selector trả rỗng, mở fixture và kiểm cấu trúc. Không dùng retry mạng để chữa một lỗi selector có thể tái hiện offline.

Khi gặp lỗi TLS, xác định chứng chỉ được kiểm thuộc hop nào. Chứng chỉ origin và chứng chỉ gateway TLS có thể do hai CA khác nhau cấp. Thay CA ở đúng nơi và giữ kiểm chứng, thay vì dùng một tùy chọn bỏ qua certificate cho toàn bộ tác vụ.

Timeout cần có ngân sách tổng. Một thao tác có thể gồm DNS, kết nối gateway, xác thực, tunnel, TLS và đọc body. Nếu retry được bật ở nhiều lớp, tổng thời gian có thể dài hơn suy nghĩ ban đầu. Đo từ lúc bắt đầu tác vụ đến khi body đã xử lý hoặc tác vụ đã hủy.

Chỉ thử lại khi có lý do và giới hạn rõ. GET trên nguồn lab có thể được retry theo chính sách; POST tạo dữ liệu cần cơ chế chống tạo trùng hoặc xác nhận trạng thái trước. Đừng cho một bài kiểm thất bại gửi lại thao tác ghi nhiều lần mà không biết server đã nhận lần đầu hay chưa.

Khi cần tra nghĩa giao thức, danh mục HTTP status của MDN giúp đọc status đúng lớp. Với lỗi mã hóa, đối chiếu cơ chế TLS của MDN và cấu hình CA của runtime đang dùng. Đây là nền tảng chẩn đoán, không phải kết quả đo trên gateway của anh em.

R rvest web scraping vận hành và bàn giao

Khi chuyển từ ví dụ sang tác vụ dùng thật, giữ cấu hình đã kiểm như một đơn vị triển khai. Mã nguồn, lockfile, giá trị không bí mật và phiên bản runtime cần đi cùng nhau. Nếu chỉ sao chép một đoạn code vào môi trường khác, phải chạy lại smoke test trước khi tăng khối lượng.

Log phục vụ vận hành nên có mã lượt chạy, nhãn cấu hình, thời gian bắt đầu, thời lượng và trạng thái cuối. Thêm số record hoặc kích thước body khi phù hợp. Không cần lưu cả payload để biết tác vụ tải có thành công; nhiều payload chứa thông tin không nên xuất hiện trong log hỗ trợ.

Giới hạn concurrency theo cả nguồn và tài nguyên máy. Thêm nhiều worker có thể làm pool chờ, tăng bộ nhớ và khiến retry chồng lên nhau. Tăng từng bước trên fixture được phép, giữ số lỗi cùng tính đúng dữ liệu bên cạnh thời gian hoàn tất.

Đừng dùng số liệu giả để điền một bảng kết quả đẹp. Khi chưa chạy một tổ hợp, ghi chưa chạy; khi thiếu credential, ghi thiếu đầu vào; khi runtime không có, ghi chưa xác minh trên runtime đó. Một trạng thái chưa kiểm rõ ràng hữu ích hơn một con số không có nguồn đo.

Thay credential theo quy trình có thời điểm hiệu lực. Tạo cấu hình mới, kiểm một request nhỏ rồi chuyển worker; kết thúc connection hoặc phiên cũ theo vòng đời công cụ. Nếu chỉ thay biến môi trường trong terminal, tiến trình đang chạy lâu có thể tiếp tục giữ giá trị đã đọc trước đó.

Giữ một phương án hoàn nguyên cụ thể. Lưu cấu hình trước thử, dừng tác vụ lab, đóng client hoặc browser và gỡ biến chỉ dùng cho phép thử. Không xóa cache, cookie hay profile dùng chung nếu một thư mục thử riêng có thể đạt cùng mục đích.

Trước khi bàn giao, người nhận nên tái lập được ví dụ bằng một bộ input nhỏ. Liệt kê tên biến cần cấp, file fixture, lệnh khởi chạy và điều kiện đạt. Không bàn giao mật khẩu để người nhận có thể chạy ngay; bàn giao cách cấp secret trong môi trường của họ.

Tách kết quả kiểm kỹ thuật khỏi quyết định xuất bản. Một bản nháp có thể giải thích đúng API nhưng vẫn cần kiểm phiên bản thật, tuyến gateway và dữ liệu của môi trường đích. Chỉ bổ sung tuyên bố tương thích hoặc hiệu năng khi có log và phép đo đủ điều kiện hỗ trợ.

Bàn giao có bằng chứng

Bàn giao có bằng chứng

Nếu tác vụ cần tải dữ liệu qua một gateway được phép, anh em có thể tham khảo mua proxy rồi kiểm giao thức và xác thực bằng các ca lab trước khi sử dụng; phần parse dữ liệu offline không cần thêm proxy.

Anh em nên giữ ví dụ nhỏ, cấu hình đã khóa và log đủ truy nguyên trước khi mở rộng tác vụ. Theo dõi Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để tham khảo nội dung liên quan. Khi đổi runtime hoặc gateway, chạy lại ca cơ sở và kiểm dữ liệu đầu ra của R rvest web scraping.

TIN TỨC LIÊN QUAN