如何使用 C# 爬虫获得专栏博客更新排行
昨天,梦姐问我们,她存在一个任务,找到 关注数排行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首页,可以联系我哦……我会在梦姐面前多多美言
参见:使用HtmlAgilityPack XPath 表达式抓取博客园数据 - 晓风拂月 - 博客园
Html Agility Pack基础类介绍及运用 - itmuse - 博客园

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
如何使用 C# 爬虫获得专栏博客更新排行的更多相关文章
- 2018-8-10-如何使用-C#-爬虫获得专栏博客更新排行
title author date CreateTime categories 如何使用 C# 爬虫获得专栏博客更新排行 lindexi 2018-08-10 19:16:51 +0800 2018- ...
- 知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET
知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET undefined 公司介绍 - 数人科技 undefined
- 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET
采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- 帧与场 - djf_1985的专栏 - 博客频道 - CSDN.NET
帧与场 - djf_1985的专栏 - 博客频道 - CSDN.NET 电视信号是通过摄像机对自然景物的扫描并经光电转换形成的.扫描方式分为“逐行扫描”和“隔行扫描”.“逐行扫描”指每幅图像均是由电子 ...
- C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN
C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN.NET 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够 ...
- 京东集团副总裁李大学:像CEO一样思考 - Dancen的专栏 - 博客频道 - CSDN.NET
京东集团副总裁李大学:像CEO一样思考 - Dancen的专栏 - 博客频道 - CSDN.NET 京东集团副总裁李大学:像CEO一样思考
- libcurl 多线程使用注意事项 - Balder~专栏 - 博客频道 - CSDN.NET
libcurl 多线程使用注意事项 - Balder~专栏 - 博客频道 - CSDN.NET libcurl 多线程使用注意事项 分类: C/C++学习 2012-05-24 18:48 2843人 ...
- SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET
SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET SAE利用storge上传文件
随机推荐
- 201521123100 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- JVM(三)内存回收(一)
最近花了相当长一段时间在看Hotspot JVM的GC和内存分配,本节先总结和回顾一下内存回收的相关知识点,内存的分配放到下节再讨论. 一.什么是JVM的GC GC即Garbage Collectio ...
- 枚举类TimeUnit
枚举类TimeUnit 全路径为 java.util.concurrent.TimeUnit TimeUnit 主要用于通知基于时间的方法如何解释给定的计时参数 举例如下 如果 lock 不可用,则以 ...
- C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的. 它的特性: 编码的简单易用 连接的复用 连接的管理 今天在配置C3p0的时候出现了这个warn 原因是因为要验证SSL Wed Se ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- Codevs1380没有上司的舞会_KEY
没有上司的舞会 1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系 ...
- 为ASP.NetCore程序启用SSL
紧接着上一篇搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi的案例,这篇来实现为ASP.NetCore启用SSL支持 由于ASP.NetCore默认服务器Kestrel不像ii ...
- Maven仓库搜索jar包依赖网址
可在该网站搜索jar包依赖 http://search.maven.org/
- Raspiberry Camera详解+picamera库+Opencv控制
使用树莓派的摄像头,将树莓派自身提供的picamera的API数据转换为Python Oencv可用图像数据: # import the necessary packages from picamer ...
- C语言 printf 格式化输出函数
用 法: int printf(const char *format,[argument]); format 参数输出的格式,定义格式为: %[flags][width][.perc] [F|N|h| ...