User Tools

Site Tools

study:anglesharp:20250311-006:index

C# 使用類似javascript selector來爬網站的工具-AngleSharp (2025-03-11)

Local Backup

  • 介紹另一款可以使用類似jquery selector的語法,來當爬蟲的工具

前言

  • 之前有介紹過一款老牌子的爬網站的工具,有興趣者可以前往(https://dotblogs.com.tw/kinanson/2017/08/22/080707),但是因為我們在做dom的操作時,比較習慣的是使用jquery或javascript找dom的方式,這個在node.js裡面有類似的package可以使用selector來爬,最後因為筆者終於發現有兩套都可以使用類似jquery的方式來爬html,一套叫做是CsQuery(https://github.com/jamietre/CsQuery),而另一套則是筆者本篇想介紹的AngleSharp(https://github.com/AngleSharp/AngleSharp),即然兩套都可以使用Selector來找dom,為何筆者會選擇AngleSharp呢?只是單純的以星星數還有維護的狀況跟issue數量做決定而已。

安裝AngleSharp

  • 一樣使用nuget來下載安裝就可以了

情境模擬

  • 這次想示範的是爬我個人部落格的文章,我想要把我所有寫過的文章標題全部爬出來,因為有分頁所以需要做一些判斷,而因為寫到了遞迴所以要特別小心,不然可能就會死當在此了,我找到的判斷是以分頁來確認是否要離開迴圈,如果還有資料的話就會有分頁,沒有的話分頁這個dom則會消失。
  • 首先來看一下我想找的dom內容是在哪邊
  • 使用chrome工具來方便直接幫我們把selector找出來
  • copy完成之後找出的selector如下
  • body > div.top-wrapper > div > div > div.content-wrapper > article:nth-child(1) > header > h3 > a
  • 接著來看一下程式碼怎麼寫的吧
  • void Main()
    {
    	var i = 1;
    	var titles = new List<string>();
    	while (true)
    	{
    		string url = "https://dotblogs.com.tw/kinanson/" + i;
    		var config = Configuration.Default.WithDefaultLoader();
    		var dom = BrowsingContext.New(config).OpenAsync(url).Result;
    		//下面是檢查分頁這個區塊
    		var page = dom.QuerySelector("body > div.top-wrapper > div > div > div.content-wrapper > div > ul");
    		if (page == null) break;
    		//下面需注意一下,因為我要爬的是全部,而不是用chrome工具找出的那一筆而已,所以我把選擇第一筆的部份刪掉
    		var title = dom.QuerySelectorAll("body > div.top-wrapper > div > div > div.content-wrapper > article > header > h3 > a").Select(x => x.TextContent);
    		titles.AddRange(title);
    		i++;
    	}
    	titles.Dump();
    }

結果

結論

  • 最後可以看到程式碼沒多少行,我就完成了想爬的所有標題內容了,不過這些爬網站的方式,都是以特定網址下去爬的,如果我想要爬的是點部落所有有angular的關鍵字的文章,這種方式就不好搞了,而當然也有另一種工具是會自動去幫我們爬所有蛛絲馬跡的,之後有空再做介紹囉。

系列文章

Permalink study/anglesharp/20250311-006/index.txt · Last modified: 2025/03/11 11:16 by jethro

oeffentlich