欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#+HtmlAgilityPack+Dapper走一波爬虫

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

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

爬虫篇

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

    HtmlAgilityPack的基本使用可以参考这篇   https://www.cnblogs.com/GmrBrian/p/6201237.html,

    效果图,多图慎入

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

 C#+HtmlAgilityPack+Dapper走一波爬虫

 

 

采集广西财政厅例子

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

First

  加载网站这个就不用说了,先查看网站的字符编码,如图<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ,然后设置HtmlAgilityPack中的OverrideEncoding属性,

C#+HtmlAgilityPack+Dapper走一波爬虫

 

htmlAgilityPack.OverrideEncoding = Encoding.UTF8;

 Second

  C#+HtmlAgilityPack+Dapper走一波爬虫

 

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

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

   流程代码:

//获取第一页的内容
HtmlNode  row = GetHtmlDoc(htmlWeb, url);
//根据xpath获取列表
var list = row.SelectNodes("//ul[@class='dzjzw_list_main_ul']//li");
 foreach (var data in list)
{
     ....
}

/// <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;
            }
        }

  文章内容的链接的XPath标签 

//a

  文章发布的时间XPath标签

//span[@class='date']

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

Third

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

C#+HtmlAgilityPack+Dapper走一波爬虫

 

Fourth

  爬取到的之后,再来一个钉钉通知,在群里拉入一个机器人,可以参考钉钉的开发文档(https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.ece6g3&treeId=257&articleId=105735&docType=1#)

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

C#+HtmlAgilityPack+Dapper走一波爬虫

  

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

后面做完了再上传到GitHub吧,下班下班。