最近由于公司业务须要,又有机会撸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