C#+HtmlAgilityPack+Dapper走一波爬蟲 開源項目Html Agility Pack實現快速解析Html

    最近由於公司業務須要,又有機會擼winform了,此次的需求是由於公司有項目申報的這塊業務,項目申報前期須要關注政府發佈的相關動態信息,政府部門網站過多,人工須要一個一個網站去瀏覽和查閱,有時候還會遺漏掉,所以呢,咱們打算用爬蟲+移動端web來作,我主要負責爬蟲和web Api。html

爬蟲篇

    爬蟲主要採用.Net強大的開源解析HTML元素的類庫HtmlAgilityPack,操做過XML的童鞋應該很快就能夠上手,經過分析XPath來解析HTML,很是的方便的,還有一款不錯的叫Jumony,沒用過,對HtmlAgilityPack比較熟悉,因此首選了HtmlAgilityPack來做爲主力軍。node

    HtmlAgilityPack的基本使用能夠參考這篇 《開源項目Html Agility Pack實現快速解析Html》。git

    效果圖,多圖慎入:github

 

採集廣西財政廳例子

  

     由於是政府發佈的出來的信息,因此信息的對外開放的,只是機器代替人工來瀏覽,不會被和諧的,主要採集文章的標題、日期和文章內容,以廣西財政廳網站爲例子。web

 

First

    加載網站這個就不用說了,先查看網站的字符編碼,如圖<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ,而後設置HtmlAgilityPack中的OverrideEncoding屬性,再開始加載,否則採集到的是亂碼,沒有意義。瀏覽器

 

htmlAgilityPack.OverrideEncoding = Encoding.UTF8;

Second

  

 

    分析文章列表,瀏覽器F12查看HTML標籤狀況,能夠分析出XPath爲:dom

//ul[@class='dzjzw_list_main_ul']//li

     文章內容的連接的XPath標籤:jsp

//a

    文章發佈的時間XPath標籤:移動端web

//span[@class='date']

 

示例流程代碼:ide

//獲取第一頁的內容
HtmlNode  row = GetHtmlDoc(htmlWeb, url);
//根據xpath獲取列表
var list = row.SelectNodes("//ul[@class='dzjzw_list_main_ul']//li");
 foreach (var data in list)
{
      HtmlNode node = HtmlNode.CreateNode(data.OuterHtml);
      HtmlNode a = node.SelectSingleNode("//a");
      HtmlNode date = node.SelectSingleNode("//span['date']");
     ....
}

/// <summary>
/// 這裏偶爾會瀏覽網頁失敗的,因此失敗了多瀏覽幾回
/// </summary
public static HtmlNode GetHtmlDoc(HtmlWeb htmlWeb, string url)
{
            try
            {
                var doc = GetDoc(htmlWeb, url);
                if (doc == null)
                {
                    int againIdx = 0;
                    while (againIdx++ < 5)
                    {
                        System.Threading.Thread.Sleep(1000);
                        doc = GetDoc(htmlWeb, url);
                        if (doc != null)
                            break;
                    }
                    if (doc == null)
                    {
                        var htmlData = HttpHelper.Get<string>(url).Result;//.GetStringAsync(url).Result;
                        return HtmlNode.CreateNode(htmlData);
                    }
                    else
                    {
                        return doc.DocumentNode;
                    }
                }
                return doc.DocumentNode;
            }
            catch
            {
                Log.Error("未能正確訪問地址:" + url);
                return null;
            }
}

/// <summary>
/// 加載網頁
/// </summary>
public static HtmlDocument GetDoc(HtmlWeb htmlWeb, string url)
{
            try
            {
                return htmlWeb.Load(url);
            }
            catch (Exception ex)
            {
                return null;
            }
}

均可以使用 HtmlNode.InnerText 來獲取到相關值,很是的方便。

Third

    文章詳細內容也如此,經過分析XPath來分析便可,最頭疼的是翻頁的問題,由於政府網站使用的技術通常都是比較那個的,你懂的,有些使用到oncilck來觸發的,有些表單提交,要具體問題具體分析了,用Fiddler和瀏覽器的F12大法來分析翻頁數據來源,在這裏的例子翻頁也比較簡單,經過拼接URL來進行翻頁便可。

 

 

Fourth

    爬取到的以後,再來一個釘釘通知,在羣里拉入一個機器人,能夠參考釘釘的開發文檔

  

    這樣咱們爬取的消息就第一時間通知到羣裏的小夥伴啦,是否是很炫酷,哈哈哈。 

    項目demo已經上傳,僅供學習

    碼雲:https://gitee.com/Backgrounder/Spider

    Git:https://github.com/EminemJK/Spider

 

Last

    評論區有提問說部分網站是動態渲染數據的,用XPath分析不到結果,若是數據不是來源於當前界面的HTML,那XPath是分析不到,這時候你須要看它的數據源來自哪裏,用Fiddler或者瀏覽器F12抓一下數據源,相似這個網站(http://www.nnhrss.gov.cn/ecdomain/framework/nnrsw/djiaakgphfalbboelieaiobfgheoldlc.jsp),

 

查看好數據源,分析出它的數據源來自這個:
http://www.nnhrss.gov.cn/ecdomain/portal/portlets/newslist/newslistcomponent.jsp?goPage=1&pageNum=1&siteID=nnrsw&pageID=djiaakgphfalbboelieaiobfgheoldlc&moduleID=djichlhahfalbboelieaiobfgheoldlc&moreURI=/ecdomain/framework/nnrsw/djiaakgphfalbboelieaiobfgheoldlc/djichlhahfalbboelieaiobfgheoldlc.do&var_temp=eobjphbogdcnbboekapmnnfcbdankadp&currfolderid=null&showChildFlag=false&displayPageLinkFlag=true),
再用xpath直接對數據源分析便可。

————————————————————————————————————————————————————————————————————

根據評論區的大神也提供了其餘好用的爬蟲庫,瞭解一下:

1> 一線碼農    node+cheerio

2>newjajk       Chromedriver

3>ZUOXIANGE   anglesharp

相關文章
相關標籤/搜索