最近由於公司業務須要,又有機會擼winform了,此次的需求是由於公司有項目申報的這塊業務,項目申報前期須要關注政府發佈的相關動態信息,政府部門網站過多,人工須要一個一個網站去瀏覽和查閱,有時候還會遺漏掉,所以呢,咱們打算用爬蟲+移動端web來作,我主要負責爬蟲和web Api。html
爬蟲主要採用.Net強大的開源解析HTML元素的類庫HtmlAgilityPack,操做過XML的童鞋應該很快就能夠上手,經過分析XPath來解析HTML,很是的方便的,還有一款不錯的叫Jumony,沒用過,對HtmlAgilityPack比較熟悉,因此首選了HtmlAgilityPack來做爲主力軍。node
HtmlAgilityPack的基本使用能夠參考這篇 《開源項目Html Agility Pack實現快速解析Html》。git
效果圖,多圖慎入:github
由於是政府發佈的出來的信息,因此信息的對外開放的,只是機器代替人工來瀏覽,不會被和諧的,主要採集文章的標題、日期和文章內容,以廣西財政廳網站爲例子。web
加載網站這個就不用說了,先查看網站的字符編碼,如圖<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ,而後設置HtmlAgilityPack中的OverrideEncoding屬性,再開始加載,否則採集到的是亂碼,沒有意義。瀏覽器
htmlAgilityPack.OverrideEncoding = Encoding.UTF8;
分析文章列表,瀏覽器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 來獲取到相關值,很是的方便。
文章詳細內容也如此,經過分析XPath來分析便可,最頭疼的是翻頁的問題,由於政府網站使用的技術通常都是比較那個的,你懂的,有些使用到oncilck來觸發的,有些表單提交,要具體問題具體分析了,用Fiddler和瀏覽器的F12大法來分析翻頁數據來源,在這裏的例子翻頁也比較簡單,經過拼接URL來進行翻頁便可。
爬取到的以後,再來一個釘釘通知,在羣里拉入一個機器人,能夠參考釘釘的開發文檔。
這樣咱們爬取的消息就第一時間通知到羣裏的小夥伴啦,是否是很炫酷,哈哈哈。
項目demo已經上傳,僅供學習
碼雲:https://gitee.com/Backgrounder/Spider
Git:https://github.com/EminemJK/Spider
評論區有提問說部分網站是動態渲染數據的,用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