2013年4月24日 星期三

透過 HTML Agility Pack 抓網頁資料


多年以前,已經忘了是從哪邊學到有關抓網頁的語法,當時能夠把網頁抓回來就已經很開心了,後面的扒資料雖然扒的很辛苦,卻也甘之如飴。時日漸增,如今想到要扒資料,不免有點力不從心。經由 Gower 的推薦,找到 HTML Agility Pack,透過類似 XML 的 XPath 方式,可以很容易的找到所需要的內容。

基本的 HTML Agility Pack 介紹可以參考 HTML Agility Pack:簡單好用的快速 HTML Parser


我在官網下載了 [Documentation] 手冊,並在 Agility 裡面找到 HtmlWeb 類別提供了一個 Load() 方法,經測試後,的確會如該文章作者所說,對於中文會出現亂碼的問題,不過可以透過設定編碼方式來解決,可參考:

HtmlAgilityPack - How to set custom encoding when loading pages


HtmlDocument hDoc = new HtmlDocument();
HtmlWeb hw = new HtmlWeb();
hw.AutoDetectEncoding = false;
hw.OverrideEncoding = System.Text.Encoding.Default;
hDoc=hw.Load("http://tw.stock.yahoo.com/q/q?s=2002");

string strResult = hDoc.DocumentNode.OuterHtml;


這裡去抓取網頁的方法是透過 HtmlWeb.Load(),而文章作者使用的則是 WebClient.DownloadData(),古早前我所學到的則是 WebRequest.GetResponse(),這三者雖然都可以完成抓網頁的功能,但以效能來說:

WebRequest.GetResponse() > WebClient.DownloadData() > HtmlWeb.Load()

可由以下效能測試圖表觀察得知。




[統計程式下載]


經由多次的測試結果來看,使用 WebRequest.GetResponse 與 WebClient.DownloadData 效能都還不錯,但使用 HtmlWeb.Load 的效能就差很多,如果將來有考慮到效能問題,應該避開使用 HtmlWeb.Load 方法。

參考: