昨天,梦姐问我们,她存在一个任务,找到 关注数排行100 和 浏览量排行100 的专栏博客,在2017年还有更新的专栏。

梦姐说他要出去一趟,M大神在吃饭,于是我估算时间,只有半个钟。

整理一下:半个钟时间,找到两个表格中,在2017年更新的专栏。这就是需求。

我开始分开需求,第一步,读取数据,读取两个表的数据。第二步获取博客更新时间,博客更新时间就是最近的文章的发布时间。第三步,把结果写到文件里。

开始因为xlsx的读取问题卡了我一下,我计算了,读取excel的方法,我需要20分钟写完,而把excel转换为csv读取,我只要1分钟,于是我就把excel格式换为csv。

到这里,预处理就做完了。

我需要定义一个数据结构,用来存储数据。

存储从表格读取到的数据,需要看一下表格存在哪些数据。

于是我定义一个类

因为不知道专栏作家叫什么,于是我就把这个类叫专家

     class Proficient
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title
        {
            get; set;
        }
        /// <summary>
        /// 网址
        /// </summary>
        public string Url
        {
            get; set;
        }

        /// <summary>
        /// 最后更新时间
        /// </summary>
        public string Date
        {
            get; set;
        }
    }

需要读取的数据有 标题 和 网址,时间是需要进行计算。标题的作用是去重,网站是输入。但是表格还有其他内容,于是随意添加两个属性把他放进去。

接下来,如何从一个博客专栏网站读取到最新更新的博客?

我这里使用 HtmlAgilityPack 帮助解析网页。

HtmlAgilityPack 是一个强大的东西,使用的方法是从nuget搜索一下,就可以得到他。

安装进去,就可以使用了。

于是我写了一个函数 static void GetDate(Proficient proficient)用于读取时间。

获取网址:var url = proficient.Url;

获取到了网址,就可以获取网页。

获取网页的方法请看代码

             HtmlWeb web = new HtmlWeb();
            HtmlDocument doc = web.Load(url);

通过查看csdn的代码,可以知道存放博客的是 detail_list

如何从 HtmlAgilityPack 获取指定的 class ?

因为有xpath的存在,使用 xpath 就可以指定 class ,xpath 是和正则差不多的东西。

关于 xpath ,请看C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子) - 数据之巅 - 博客园

看到detail_list前面是 ul 所以 xpath可以这样写

             var temp = doc.DocumentNode.SelectNodes("//ul[@class='detail_list']/li");

其中的//就是从网页任意位置

ul就是标签,指定哪个标签,之后就是标签是否存在属性,这里指定属性是 class ,看起来很简单。那么后面的/li就是路径,其实知道一个元素在哪,可以直接用路径来写。

但是我发现,其实找到detail_b更快

下面就是专栏的代码,可以看到时间使用的 class 是detail_b

        <ul class="detail_list">
                <li>
                  <h4><a href="http://blog.csdn.net/lindexi_gd/article/details/52041944" target="_blank">win10 uwp 入门</a></h4>
                  <p class="detail_p">UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客。</p>
                  <div class="detail_b"><span>2016-07-27 08:55</span>
                    <div class="fa fa-eye"></div><em>2752</em>
                  </div>
                </li>

于是把代码改为

                temp = doc.SelectNodes("//div[@class='detail_b']");

和上面一样,只是这里使用的是div,接下来就是拿到时间。

去掉html之后的文本就是时间

于是拿到第一个的时间就是博客的更新时间了,可能有些大神排序不是按照时间排的,但是这里不处理。

如何获取文本?请看代码

                proficient.Date = temp.Elements().FirstOrDefault().InnerText;

这样就是获取到了日期了,因为存在一些时间是 昨天 9:00的,我就没转换了

日期获取完成,就是写入文件,写入的文件很简单,直接放代码

         private static void Write(List<Proficient> proficient)
        {
            string file = "E:\\专栏排行\\csdn排行100.csv";
            using (StreamWriter stream=new StreamWriter(new FileStream(file,FileMode.Create),Encoding.GetEncoding("gbk")))
            {
                foreach (var temp in proficient)
                {
                    stream.WriteLine(temp.Title+","+temp.Url+","+temp.Date+","+temp.Folpv+","+temp.Num);
                }
            }
        }

需要改进的:

使用命令行指定读取文件,判断博客最新的日期,不可以使用第一篇博客。

去重不可以使用博客专栏标题,因为存在重复。

如果大家有写质量高的文章,想推荐到csdn首页,可以联系我哦……我会在梦姐面前多多美言

2017 CSDN博客专栏评选

参见:使用HtmlAgilityPack XPath 表达式抓取博客园数据 - 晓风拂月 - 博客园

Html Agility Pack基础类介绍及运用 - itmuse - 博客园


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

如何使用 C# 爬虫获得专栏博客更新排行的更多相关文章

  1. 2018-8-10-如何使用-C#-爬虫获得专栏博客更新排行

    title author date CreateTime categories 如何使用 C# 爬虫获得专栏博客更新排行 lindexi 2018-08-10 19:16:51 +0800 2018- ...

  2. 知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET

    知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET undefined 公司介绍 - 数人科技 undefined

  3. 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET

    采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined

  4. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  5. 帧与场 - djf_1985的专栏 - 博客频道 - CSDN.NET

    帧与场 - djf_1985的专栏 - 博客频道 - CSDN.NET 电视信号是通过摄像机对自然景物的扫描并经光电转换形成的.扫描方式分为“逐行扫描”和“隔行扫描”.“逐行扫描”指每幅图像均是由电子 ...

  6. C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN

    C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN.NET 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够 ...

  7. 京东集团副总裁李大学:像CEO一样思考 - Dancen的专栏 - 博客频道 - CSDN.NET

    京东集团副总裁李大学:像CEO一样思考 - Dancen的专栏 - 博客频道 - CSDN.NET 京东集团副总裁李大学:像CEO一样思考

  8. libcurl 多线程使用注意事项 - Balder~专栏 - 博客频道 - CSDN.NET

    libcurl 多线程使用注意事项 - Balder~专栏 - 博客频道 - CSDN.NET libcurl 多线程使用注意事项 分类: C/C++学习 2012-05-24 18:48 2843人 ...

  9. SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET

    SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET SAE利用storge上传文件

随机推荐

  1. 团队作业4——第一次项目冲刺(Alpha版本)4.24

    ·本次会议为第三次Scrum Meeting会议~ ·本次会议项目经理召开时间为15:00,在教学楼教室召开,召开时长约30分钟,探讨了昨日任务的进展.遇到的困难以及后续所要开展的工作. 1.站立式会 ...

  2. 201521123053《Java程序设计》第3周学习总结

    ---恢复内容开始--- 1. 本周学习总结 2. 书面作业 1. 代码阅读 以上代码可否编译通过?哪里会出错?为什么?尝试改正?        如果创建3个Test1对象,有内存中有几个i,几个j? ...

  3. ASCII中关于大小写字母间隔为32的思考

    一直没有搞清楚为什么在ASCII中要把大小写字母的间隔设置为32,今天才发现这样设置的精妙之处:方便了程序对大小写字母进行转换.请看: ================= 十进制        32 ...

  4. 201521145048《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jm ...

  5. 201521123011 《java程序设计》 第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  6. 201521123009 《Java程序设计》第11周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 Q1:互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问 ...

  7. Junit4学习(二)测试失败的情况

    一,前言 首先理解: 1,测试用例不是证明你是对的,而是证明你没有错 2,测试用例用来达到想要的预期结果,但对于逻辑错误无能为力 二,两种测试失败:error And Failure 1,Failur ...

  8. 第一部分----HTML的基本结构与基本标签

    PART-1  HTML的基本结构以及Header的部分 一.什么是HTML? HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构: 三.详细注释 ...

  9. 在腾讯云上搭建WordPress博客

    笔者一直很羡慕那些搭建了个人博客的大牛,在最近工作之余也尝试着搭建了自己的博客,历时1周,这篇文章就将踩过的坑记录下来,先看下成果,链接在此 1- 购买腾讯云主机 腾讯云官网,我选了79元/月的最便宜 ...

  10. jpa 多对多关系的实现注解形式

    1, 表结构 1)设备表 VTM_DEVICE_INFO create table VTM_DEVICE_INFO ( ID INTEGER not null, SN ) not null, STAT ...