• C#+HtmlAgilityPack+Dappe


    C#+HtmlAgilityPack+Dappe

    (转发请注明来源:http://www.cnblogs.com/EminemJK/)

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

    爬虫篇

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

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

        效果图,多图慎入

    采集广西财政厅例子

      

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

    First

      加载网站这个就不用说了,先查看网站的字符编码,如图 ,然后设置HtmlAgilityPack中的OverrideEncoding属性,再开始加载,不然采集到的是乱码,没有意义。

    htmlAgilityPack.OverrideEncoding = Encoding.UTF8;

    Second

      

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

    //ul[@class='dzjzw_list_main_ul']//li
        文章内容的链接的XPath标签:

    //a
        文章发布的时间XPath标签:

    //span[@class='date']

    示例流程代码:

    复制代码
    //获取第一页的内容
    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
    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(url).Result;//.GetStringAsync(url).Result;
    return HtmlNode.CreateNode(htmlData);
    }
    else
    {
    return doc.DocumentNode;
    }
    }
    return doc.DocumentNode;
    }
    catch
    {
    Log.Error("未能正确访问地址:" + url);
    return null;
    }
    }

    ///


    /// 加载网页
    ///

    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

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

      

      这样我们爬取的消息就第一时间通知到群里的小伙伴啦,是不是很炫酷,哈哈哈。后面做完了再上传到GitHub吧,持续更新,一起进步,下班下班。

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

    根据评论区的大神也提供了其他好用的爬虫库,了解一下:

    1> 一线码农   node+cheerio

    2>newjajk    Chromedriver

    3>ZUOXIANGE anglesharp

  • 相关阅读:
    体温上报APP2.2(第二阶段总结)
    体温上报APP2.1
    体温上报APP2.0
    体温上报APP1.2
    体温上报APP1.1
    个人作业——体温上报APP
    安卓学习14(ViewPager)
    安卓学习13(RecyclerView)
    安卓学习12(ListView)
    javascript获得给定日期的前一天的日期
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/8969241.html
Copyright © 2020-2023  润新知