文档章节

C#+HtmlAgilityPack+Dapper走一波爬虫

o
 osc_mervd488
发布于 2018/04/23 17:19
字数 1041
阅读 28
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

爬虫篇

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

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

    效果图,多图慎入:

 

采集广西财政厅例子

  

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

 

First

    加载网站这个就不用说了,先查看网站的字符编码,如图<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ,然后设置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>
/// 这里偶尔会浏览网页失败的,所以失败了多浏览几次
/// </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 来获取到相关值,非常的方便。

Third

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

 

 

Fourth

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

  

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

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

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

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

 

Last

    评论区有提问说部分网站是动态渲染数据的,用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

本文已独家授权给脚本之家(ID:jb51net)公众号发布

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
上周热点回顾(4.23-4.29)

热点随笔: · 一个普通程序员眼中的「技术」(陈宏鸿) · Qone 正式开源,使 javascript 支持 .NET LINQ(【当耐特】) · 【原创】分布式之缓存击穿(孤独烟) · 如何为分布式系统优雅的...

osc_6nds72mv
2018/05/01
3
0
Python爬虫入门教程 8-100 蜂鸟网图片爬取之三

蜂鸟网图片--啰嗦两句 前几天的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用 希望你喜欢爬取页面 本篇教程还是基于学习的目的,为啥选择蜂鸟,没办法,我瞎选的。 ...

osc_r33mp6vv
2018/12/20
1
0
Python爬虫入门教程 8-100 蜂鸟网图片爬取之三

1. 蜂鸟网图片-啰嗦两句 前几天的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用 希望你喜欢 爬取页面 本篇教程还是基于学习的目的,为啥选择蜂鸟,没办法,我瞎选的。...

梦想橡皮擦
2019/04/17
0
0
头条笔试

updata: 2018-5-12 免费馅饼 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(a) cerr<<#a<<"=="<<a<<endl 4 using namespace std; 5 typedef long lon......

osc_bwyiczki
2018/03/24
0
0
Python数据可视化:2018年北上广深空气质量分析

感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖...

天善智能
2018/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

macz技巧分享—macOS高端使用技巧

Macos 的占有量不如 Windows,两者之间当操作方式也有很大的不同,当很多人熱悉 Windows 的操作之后,再接触 macos,觉得难上手,其实是习惯问题。如果你学习一些技巧,会觉得 macos 其实也不...

mac小叮当
26分钟前
11
0
手把手教你如何用黑白显示器显示彩色!

来源:大数据文摘 本文约1000字,建议阅读6分钟。 本文为你介绍如何通过黑白显示器上也能显示出彩色。 原来在黑白显示器上也能显示出彩色啊!通过在监视器上覆盖拜耳滤色镜,并拼接彩色图像,...

osc_jklrr90y
26分钟前
18
0
key-value结构排序:给定一个字符串,统计每个字符出现频率,先按value降序,再按key升序

对于key-value结构的排序 第一种:lambda表达式 第二种:函数 第三种:类对()的重载,仿函数形式 #include <iostream>#include <vector>#include <unordered_map>#include <string>#in......

osc_gwtkg2dc
27分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》 目录 世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球...

osc_vew1u0h0
28分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三)

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三) 目录 2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》 演讲嘉宾 演讲内容 ...

osc_8o71811p
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部