山治先生 脚本之家


C# + HtmlAgilityPack + Dapper走一波爬虫_Java

最近因为公司业务需要,又有机会撸winform了,这次的需求是因为公司有项目申报的这块业务,项目申报前期需要关注政府发布的相关动态信息,政府部门网站过多,人工需要一个一个网站去浏览和查阅,有时候还会遗漏掉,因此呢,我们打算用爬虫+移动端web来做,我主要负责爬虫和web Api。

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_02爬虫篇

爬虫主要采用.Net强大的开源解析HTML元素的类库HtmlAgilityPack,操作过XML的童鞋应该很快就可以上手,通过分析XPath来解析HTML,非常的方便的,还有一款不错的叫Jumony,没用过,对HtmlAgilityPack比较熟悉,所以首选了HtmlAgilityPack来作为主力军。

HtmlAgilityPack的基本使用可以参考这篇 《开源项目Html Agility Pack实现快速解析Html》[1]

效果图,多图慎入:

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_03C# + HtmlAgilityPack + Dapper走一波爬虫_Java_04

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_05

采集广西财政厅例子

 C# + HtmlAgilityPack + Dapper走一波爬虫_Java_06 

因为是政府发布的出来的信息,所以信息的对外开放的,只是机器代替人工来浏览,不会被和谐的,主要采集文章的标题、日期和文章内容,以广西财政厅网站为例子。

First

加载网站这个就不用说了,先查看网站的字符编码,如图<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ,然后设置HtmlAgilityPack中的OverrideEncoding属性,再开始加载,不然采集到的是乱码,没有意义。

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_07

htmlAgilityPack.OverrideEncoding = Encoding.UTF8;

SecondC# + HtmlAgilityPack + Dapper走一波爬虫_Java_08

分析文章列表,浏览器F12查看HTML标签情况,可以分析出XPath为:

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

文章内容的链接的XPath标签:

//a

文章发布的时间XPath标签:

//span[@class='date']

示例流程代码:

HtmlNode  row =
 list = row.SelectNodes( ( data == node.SelectSingleNode(= node.SelectSingleNode( 
 
 doc = (doc ==  againIdx =  (againIdx++ < = (doc !=  (doc ==  htmlData = HttpHelper.Get<>(url).Result;
                         +  
 
  HtmlDocument GetDoc(HtmlWeb htmlWeb,

都可以使用 HtmlNode.InnerText 来获取到相关值,非常的方便。

Third

文章详细内容也如此,通过分析XPath来分析即可,最头疼的是翻页的问题,因为政府网站使用的技术一般都是比较那个的,你懂的,有些使用到oncilck来触发的,有些表单提交,要具体问题具体分析了,用Fiddler和浏览器的F12大法来分析翻页数据来源,在这里的例子翻页也比较简单,通过拼接URL来进行翻页即可。

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_09

Fourth

爬取到的之后,再来一个钉钉通知,在群里拉入一个机器人,可以参考钉钉的开发文档[2]

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_10

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_11C# + HtmlAgilityPack + Dapper走一波爬虫_Java_12

这样我们爬取的消息就第一时间通知到群里的小伙伴啦,是不是很炫酷,哈哈哈。 

项目demo已经上传,仅供学习

码云:https://gitee.com/Backgrounder/Spider

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

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_13

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_14

Last

评论区有提问说部分网站是动态渲染数据的,用XPath分析不到结果,如果数据不是来源于当前界面的HTML,那XPath是分析不到,这时候你需要看它的数据源来自哪里,用Fiddler或者浏览器F12抓一下数据源,类似这个网站(http://www.nnhrss.gov.cn/ecdomain/framework/nnrsw/djiaakgphfalbboelieaiobfgheoldlc.jsp),

C# + HtmlAgilityPack + Dapper走一波爬虫_Java_15

查看好数据源,分析出它的数据源来自这个:
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】:http://www.cnblogs.com/GmrBrian/p/6201237.html

【2】:https://open-doc.dingtalk.com/doc.htm?docId=105735&docType=1#

本文作者:山治先生

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。