Home Chia sẻ Thu thập nội dung trang web với HTML Agility Pack

Author

Date

Category

HTML Agility Pack là một trình phân tích cú pháp HTML mạnh mẽ. Trả về đối tượng kiến trúc dạng DOM, để có thể truy vấn lấy dữ liệu dễ dàng.

Web crawling – Từ đâu mà ra?

Trước giờ, để lấy dữ liệu của 1 trang web, thì ta có 1 số cách. Như qua API, RSS nếu được trang web cung cấp. Dữ liệu ít thì ta copy, paste luôn cho nó to tay ^^. Nhưng cuộc đời đôi khi nó không nhẹ nhàng thế. Không có api, rss hay phương pháp chia sẻ nào khác được cung cấp. Dữ liệu cần lấy nhiều và có biến động.

Thế nên mới đẻ ra cái lĩnh vực Web Crawling (thu thập hoặc trích xuất dữ liệu từ website).

Một vài ứng dụng tham khảo

  • Lấy danh sách các sản phẩm đang khuyến mại trên tiki, shopee…
  • Lấy danh mục sản phẩm của trang web đối thủ.
  • Giám sát giá sản phẩm và nguồn hàng cung cấp.
  • Lấy các bài viết mới nhất từ zingnews.vn, vnexpress.net… về làm dữ liệu cho app tin tức của bạn.
  • Và như mình lấy các dữ liệu truyện tranh từ các trang web đọc truyện online, để tải về đọc offline. ^^
  • Vân vân và mây mây ứng dụng.

Các bạn có thể tham khảo ứng dụng CrawlComic – Tải truyện tranh miễn phí của mình.

Và nhu cầu thực tế

Thử lên fiverr.com (là 1 network freelance rất lớn ở thị trường quốc tế), tìm kiếm với từ khóa web crawling hoặc web scraping. Bạn sẽ nhận được rất nhiều kết quả từ nhu cầu cần thuê, tới nhu cầu cho thuê ở lĩnh vực này.

fiverr-web-crawling-web-scraping-with-html agility pack
Với skill nhỏ nhưng có võ này, bạn hoàn toàn có thể khởi nghiệp với con đường trở thành freelancer

Rồi, tới phần quan trọng nhất, để trả lời cho câu hỏi. Làm thế nào để có thể thu thập được dữ liệu từ trang web bằng HTML Agility Pack? Chúng ta sẽ cùng đi tìm hiểu nó là gì và sử dụng như nào?

Thế HTML Agility Pack là gì?

Cùng điểm qua một số thông tin về nó.

  • HTML Agility Pack là một trình phân tích cú pháp HTML khá mạnh. Trả về đối tượng HtmlDocument kiến trúc dạng DOM (Document Object Model). Có thể đọc/ghi và hỗ trợ truy vấn dạng XPath (Đường dẫn XML hoặc XSLT) Css Selectors.
  • Là một thư viện mã .NET cho phép bạn phân tích cú pháp các tệp HTML.
  • Nó rất phổ biến. Lý do là vì nó “chơi” được với hầu hết html (cả hợp lệ và không hợp lệ). Trong thực tế thì số lượng website có HTML không hợp lệ nhiều vô số kể. Các thư viện khác sẽ dễ bị lỗi, thằng này thì không.
  • Và trên thực tế, bạn có thể quét hầu hết các trang web có trên internet bằng thư viện này.

HTML Agility Pack sử dụng như thế nào?

Bước 1: Cài đặt

HtmlAgilityPack có thể được tải xuống từ NuGet .  

Bạn có thể đặt qua GUI hoặc lệnh sau trong Package Manager Console:

PM> Install-Package HtmlAgilityPack -Version 1.11.24

Bạn cũng có thể cài đặt cùng một thư viện cho .NET Core 

PM> dotnet add package HtmlAgilityPack.NetCore --version 1.5.0.1

Vậy là xong, bây giờ bạn có thể có thể sử dụng HtmlAgilityPack trong ứng dụng của mình.

Bước 2: Sử dụng

Có 4 tùy chọn để bắt đầu thao tác nội dung HTML:

Tải Html từ tệp

Phương thức HtmlDocument.Load tải một tài liệu HTML từ một tệp.

string filePath = @"c:\inetpub\wwwroot\yaiba\home.html";
var doc = new HtmlDocument();
doc.Load(filePath);
var node = doc.DocumentNode.SelectSingleNode("//body");

Tải Html từ chuỗi

Phương thức HtmlDocument.LoadHtml tải tài liệu HTML từ chuỗi được chỉ định.

var htmlString =
@"<!DOCTYPE html>
<html>
	<head>
		<title>Tat Diep'blog</title>
	</head>
	<body>
		<h1>This is 
			<b>bold</b> heading
		</h1>
		<p>This is 
			<u>underlined</u> paragraph
		</p>
		<h2>This is 
			<i>italic</i> heading
		</h2>
	</body>
</html>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlString);
var body = doc.DocumentNode.SelectSingleNode("//body");

Tải Html từ Web

Phương thức HtmlWeb.Load lấy một tài liệu HTML từ một tài nguyên internet.

var url = @"http://doninhtatdiep.com";
var web = new HtmlWeb();
var doc = web.Load(url);
var node = doc.DocumentNode.SelectSingleNode("//head/title");

Tải Html từ trình duyệt

Phương thức HtmlWeb.Load lấy một tài liệu HTML từ trình duyệt web. Có thể đợi JavaScript được chạy bằng cách tùy chỉnh tham số isBrowserScriptCompleted.

using System.Windows.Forms;
string url = "https://html-agility-pack.net/from-browser";
var web1 = new HtmlWeb();
var doc1 = web1.LoadFromBrowser(url, o =>
{
	var webBrowser = (WebBrowser) o;
	// WAIT until the dynamic text is set
	return !string.IsNullOrEmpty(webBrowser.Document.GetElementById("uiDynamicText").InnerText);
});
var t1 = doc1.DocumentNode.SelectSingleNode("//div[@id='uiDynamicText']").InnerText;

var web2 = new HtmlWeb();
var doc2 = web2.LoadFromBrowser(url, html =>
{
	// WAIT until the dynamic text is set
	return !html.Contains("<div id=\"uiDynamicText\"></div>");
});
var t2 = doc2.DocumentNode.SelectSingleNode("//div[@id='uiDynamicText']").InnerText;

Console.WriteLine("Text 1: " + t1);
Console.WriteLine("Text 2: " + t2);

Sau khi tải cấu trúc html về thành công. Ta sẽ dùng XPath để truy vấn tới các thẻ cần lấy dữ liệu. Cú pháp truy vấn qua XPath các bạn có thể tham khảo qua bài viết: Tổng hợp các công nghệ sử dụng để code tool Crawler Comic của mình. Mục XPath.

Project demo

Mình có code mẫu một project lấy các tin bài mới nhất, của vnexpress.net, dantri.com.vn và kenh14.vn. Để các bạn tham khảo. Tất nhiên, để thành hình một ứng dụng hoàn chỉnh, thì còn nhiều yếu tố khác. Các bạn phải tạo csdl lưu trữ, xử lý theard để tải, xử lý đặt lịch định kỳ quét dữ liệu…

Tải xuống: Source code CrawlNews
Source code CrawlNews
Đã tải xuống: 18, kích cỡ: 2.55 MB, ngày: 15 Aug. 2020

Còn rất nhiều cái hay ho, khi các bạn bắt tay vào mần mò trong mảng này. Hi vọng các bạn sẽ nhặt nhạnh được ít thông tin bổ ích. 🙂

4 COMMENTS

0 0 vote
Article Rating
Subscribe
Notify of
guest
4 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Phong Phạm
Phong Phạm
16 days ago

A ơi e có xem qua bài viết của a, e có làm theo được vài cái rồi. A cho e hỏi vd như e crawl http://muoihungauto.com.vn/ menu danh mục theo hãng xe và sub của danh mục này, e crawl được rồi nhưng làm sao để nó lưu được mối quan hệ giữa cái sub và cái main đó ạ.

Phong Phạm
Phong Phạm
14 days ago
Reply to  Tất Điệp

Dạ a, tại e mới học code nên còn yếu chưa biết hết á a

Recent posts

Thu thập nội dung trang web với HTML Agility Pack

HTML Agility Pack là một trình phân tích cú pháp HTML mạnh mẽ. Trả về đối tượng kiến trúc dạng DOM, để...

Tổng hợp các công nghệ sử dụng để code tool Crawler Comic

Không có gì quá cao siêu. Bài viết này sẽ trả lời cho các bạn coder biết, những công nghệ, thư viện...

Tải full truyện tranh miễn phí với Crawler Comic

Crawler Comic là một ứng dụng nhỏ do tôi phát triển. Cho phép người dùng tải về những bộ manga, truyện tranh Nhật Bản, ưa thích của mình. Xuất ra các định dạng thông dụng như ảnh, pdf, zip. Và dễ dàng đọc trên pc hoặc các thiết bị cầm tay như điện thoại, ipab...

Recent comments

4
0
Would love your thoughts, please comment.x
()
x