当前位置: 首页 > 编程日记 > 正文

技术图文:如何利用C#爬取CSDN的博客文章?

背景

大家有没有这样的体验,在 CSDN 上发现某个博主有很多干货文章,我们就想拿到这个博主以往文章的列表,在需要的时候进行查询和浏览。

如果从 CSDN 网站上用复制粘贴的方式来建立这个列表,一个是工作量很大,另一个博主更新了文章,也不会第一时间知道。

所以,我想做这样的一个工具,把自己关注的 博主 主页地址存储下来,通过程序来构建这个列表,以便在需要查询资料的时候能够方便的找到。

本次,以 爬取 “老马的程序人生” 为例,来介绍如何爬取该博主的文章列表。


技术分析

首先,我们来看一下需要爬取的网页。

CSDN blog

第一页对应的网址为:

https://blog.csdn.net/lsgo_myp/article/list/1?

第二页对应的网址为:

https://blog.csdn.net/lsgo_myp/article/list/2?

以此类推,我们就能找到要爬取的网页地址。

其次,我们来看一下网页的源代码。

源码01

从以上源代码,我们发现文章列表都包含在 article-item-box 类当中。

源码02

从以上源代码,我们发现有一篇文章的 style 属性为 display:none,该篇文章不显示,当然也不是博主写的,不清楚 CSDN 放置这篇文章的目的是什么。

对于其它的文章,在 h4 标签中包含了文章的标题和对应的url地址、在 date 类中包含了文章的发表时间、在 read-num 类的 num 类中包含了文章的阅读数。

只要我们获取到网页对应的HTML DOM树,通过相应的标签就可以得到希望的数据。


代码实现

Step01:构造存储文章的结构 CsdnDataItem

public class CsdnDataItem
{/// <summary>/// 发表时间/// </summary>public DateTime Data { get; set; }/// <summary>/// 阅读数/// </summary>public int ReadNum { get; set; }/// <summary>/// 文章标题/// </summary>public string Title { get; set; }/// <summary>/// 网址/// </summary>public string Url { get; set; }}

Step02:获取对应网页的 HTML Dom TREE

public static IHtmlDocument GetHtmlDocument(string url)
{IHtmlDocument document;try{document = new JumonyParser().LoadDocument(url);}catch{document = null;}return document;
}

Step03:获取文章列表 List<CsdnDataItem>

public static string EntryPoint;public static List<CsdnDataItem> GetArticle(int page)
{List<CsdnDataItem> result = new List<CsdnDataItem>();string url = EntryPoint + @"/article/list/" + page + "?";IHtmlDocument document = HtmlSpiter.GetHtmlDocument(url);if (document == null)return result;List<IHtmlElement> lists = document.Find(".article-item-box").ToList();for (int i = 0; i < lists.Count; i++){IHtmlAttribute attribute = lists[i].Attribute("style");if (attribute != null&& attribute.AttributeValue.Contains("display: none"))continue;CsdnDataItem item = new CsdnDataItem();IHtmlElement temp = lists[i].FindSingle("h4");item.Url = temp.FindSingle("a").Attribute("href").AttributeValue;string title = temp.FindSingle("a").InnerHtml().Trim();int index = title.LastIndexOf("</span>", StringComparison.Ordinal);if (index != -1){title = title.Substring(index + 7).Trim();}item.Title = title;string date = lists[i].FindSingle(".date").InnerHtml().Trim();item.Data = DateTime.Parse(date);string rednum = lists[i].FindFirst(".read-num").FindSingle(".num").InnerHtml().Trim();item.ReadNum = int.Parse(rednum);result.Add(item);}return result;
}

总结

我们来看一下具体的应用:

private void btn_Click(object sender, EventArgs e)
{CsdnUtility.EntryPoint = comboBoxPage.Text;int pageTo = integerInput1.Value;List<CsdnDataItem> lst = new List<CsdnDataItem>();for (int i = 1; i <= pageTo; i++){List<CsdnDataItem> temp = CsdnUtility.GetArticle(i);if (temp.Count == 0)break;lst.AddRange(temp);}ShowInGrid(lst);
}

获取的文章列表,如下所示:

爬取结果

这些数据慢慢积累起来,就可作为构建自己知识库的基础了,是不是很有意思。

今天就到这里吧!希望对大家有用,See You!


相关图文

  • 如何利用 C# 实现 K 最邻近算法?
  • 如何利用 C# 实现 K-D Tree 结构?
  • 如何利用 C# + KDTree 实现 K 最邻近算法?
  • 如何利用 C# 对神经网络模型进行抽象?
  • 如何利用 C# 实现神经网络的感知器模型?
  • 如何利用 C# 实现 Delta 学习规则?
  • 如何利用 C# 爬取带 Token 验证的网站数据?
  • 如何利用 C# 向 Access 数据库插入大量数据?
  • 如何利用 C# 开发「桌面版百度翻译」软件!
  • 如何利用 C# 开发「股票数据分析软件」(上)
  • 如何利用 C# 开发「股票数据分析软件」(中)
  • 如何利用 C# 开发「股票数据分析软件」(下)
  • 如何利用 C# 爬取「财报说」中的股票数据?
  • 如何利用 C# 爬取 One 持有者返利数据!
  • 如何利用 C# 爬取Gate.io交易所的公告!
  • 如何利用 C# 爬取BigOne交易所的公告!
  • 如何利用 C# 爬取 ONE 的交易数据?
  • 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
  • 如何利用 C# 爬取「猫眼电影专业版:票房」数据!
  • 如何利用 C# 爬取「猫眼电影:最受期待榜」及对应影片信息!
  • 如何利用 C# 爬取「猫眼电影:国内票房榜」及对应影片信息!
  • 如何利用 C# + Python 破解猫眼电影的反爬虫机制?
  • 如何利用BigOne的API制作自动化交易系统 – 身份验证
  • 如何利用BigOne的API制作自动化交易系统 – 获取账户资产
  • 如何利用BigOne的API制作自动化交易系统 – 订单系统

相关文章:

SAP BADI应用

SAP BADI应用 1.定义BADI 1) T-Code: SE18 Business Add-In Define. 2) 输入要创建的BADI的名字&#xff0c;点击"Create"。 3) 输入BADI的描述性文本&#xff0c;在"Interface"选项卡上输入接口的名字&#xff0c;也可以采用SAP建议的接口的…

为什么多 TCP 连接比单 TCP 连接传输快

转自&#xff1a; 我观察到&#xff0c;客户端机器从单一服务器使用 HTTP 下载一个文件&#xff1a;1. 单连接下载&#xff0c;速度没有达到客户端网络的最大带宽&#xff1b;2. 多连接同时下载&#xff0c;传输速度有极大的提高&#xff0c;带宽被占满。假设如下前提&#xff…

学Python的好处有哪些?

Python是一种比较简单的编程语言技术&#xff0c;想要快速进入到IT行业&#xff0c;Python是非常好的选择&#xff0c;为什么这么说呢?下面小编就为大家详细的介绍一下学Python的好处有哪些? ​  学Python的好处有哪些? 1.如果你是一名新媒体相关人员&#xff0c;学习Pyth…

技术图文:如何利用C# 实现 Kruskal 最小生成树算法?

背景 以前我写过一些图文来介绍有关数据结构与算法的知识&#xff1a; 8大排序算法之&#xff1a;直接插入排序&#xff08;Straight Insertion Sort&#xff09;8大排序算法之&#xff1a;希尔插入排序&#xff08;Shell Insertion Sort&#xff09;8大排序算法之&#xff1…

又偷懒了4个月,督促自己

又偷懒了4个月 每天浑浑噩噩&#xff0c;做着无聊简单的体力活&#xff0c;我不应该是这个追求撒&#xff01;~~ 爸爸说的对&#xff0c;无论怎么样自己都要独立&#xff0c;要学习&#xff0c;爸爸希望我还去继续学习会计&#xff0c;我看下半年吧&#xff0c;各种学习都要&am…

java.lang.NoSuchMethodError: org.springframework.web.context.support.XmlWebApplicationContext.getEnv

转自&#xff1a;https://blog.csdn.net/u012941811/article/details/16960493 ava.lang.NoSuchMethodError: org.springframework.web.context.support.XmlWebApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment; at 缺 org.springf…

零基础可以学好UI设计吗

随着UI设计行业的不断扩大发展&#xff0c;很多人都想要学习UI设计技术&#xff0c;但有很多同学都是零基础&#xff0c;想知道零基础可以学好UI设计吗?我们来看看下面的详细介绍就知道了。 零基础可以学好UI设计吗? 如果零基础自己学习UI设计着实有点吃力&#xff0c;毕竟对…

技术图文:如何利用C# 实现 Prim 最小生成树算法?

背景 我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法&#xff1f;&#xff0c;Kruskal 算法通过寻找边最优的方式来构造最小生成树&#xff0c;本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法&#xff0c;Prim 算法通过寻找顶点最优的方式来构造最小生成树…

去除iphone图标的半弧高亮效果

只需要在info.plist里面添加一条记录UIPrerenderedIcon 新版的XCODE 会自动识别为Icon already includes gloss effects 打上勾就OK了 如果没有识别的右边栏写上YES就可以。转载于:https://www.cnblogs.com/jiewong/archive/2011/01/14/1935718.html

【短视频SDK - 参数解析】对焦模式、裁剪模式、视频质量、分辨率、视频比例、帧率、关键帧间隔等参数解析...

1.参数简析 参数名称简介影响裁剪模式分为填充模式和裁剪模式影响图像画面的展示细节视频质量是指生成的视频的输出参数&#xff0c;是一组参数决定的数值视频清晰度和文件大小分辨率图像分辨率则是单位英寸中所包含的像素点数&#xff0c;分辨率影响图像大小&#xff0c;与图像…

21年最新Python面试题及答案汇总详解(上)

错过三月找工作的机会&#xff0c;还要错过四月的好时期吗?Python面试你做准备了吗?下面小编整理了一套2021年最新Python常见面试题目&#xff0c;及Python面试题目答案汇总。希望能够帮助到大家。 21年最新Python面试题及答案汇总详解(上) 1、列表(list)和元组(tuple)有什么…

sina微博api源码阅读之函数

1. array_map将类的静态成员函数作为回调函数用在指定的单元上&#xff0c;可以递归调用 public static function urlencode_rfc3986($input) { if (is_array($input)) { return array_map(array(OAuthUtil, urlencode_rfc3986), $input); } else …

LeetCode实战:将有序数组转换为二叉搜索树

题目英文 Given an array where elements are sorted in ascending order, convert it to a height balanced BST. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by mo…

Spring、Spring Boot和TestNG测试指南 - @ActiveProfiles

Github地址 ActiveProfiles可以用来在测试的时候启用某些Profile的Bean。本章节的测试代码使用了下面的这个配置&#xff1a; Configuration public class Config {BeanProfile("dev")public Foo fooDev() {return new Foo("dev");}BeanProfile("prod…

python语言中如何使用注释

每一种计算机语言都有自己的注释方式&#xff0c;我们知道注释的作用是解释这些代码&#xff0c;方便程序员以后的检查和修改。而且注释的一部分在运行程序的过程中不起作用&#xff0c;也不会显示出来。下面我们将为大家介绍&#xff0c;在python语言中如何使用注释? 在pytho…

RHEL5(CentOS)下nginx+php+mysql+tomcat+memchached配置全过程(转)

RHEL5(CentOS)下nginxphpmysqltomcatmemchached配置全过程 一、准备工作&#xff1a; SSH,telnet终端中文显示乱码解决办法 vi /etc/sysconfig/i18n将内容改为 LANG"zh_CN.GB18030" LANGUAGE"zh_CN.GB18030:zh_CN.GB2312:zh_CN" SUPPORTED"zh_CN.GB18…

LeetCode实战:搜索二维矩阵

题目英文 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted from left to right.The first integer of each row is greater than the last integer of the previou…

windows指令

为什么80%的码农都做不了架构师&#xff1f;>>> C:\Windows\System32\drivers\etc nbtstat -a 1.7.2.2s 检查该IP的主机名称 WExNmU5Z windows启动配置界面 在“运行”中输入“msconfig mstsc -admin 远程 虚拟机的判断&#xff1a;如果有vmtoolsd.exe进程就是虚拟…

Java培训好不好?零基础可以学吗?

5g时代的来临&#xff0c;越来越多的人开启智能时代&#xff0c;互联网行业的发展速度越来越快&#xff0c;高薪行业一直受到很多人的关注&#xff0c;尤其是java这一块&#xff0c;很多人都想学习&#xff0c;那么参加Java培训好不好?零基础可以学吗? Java培训好不好?零基础…

顺水行舟,逆水行舟

水&#xff0c;或温柔&#xff0c;或猛烈 万物皆可比喻为水 顺水行舟&#xff0c;逆水行舟&#xff0c;皆为操船者智慧之体现 翻船者。。。把船搞翻了几回还执意而为&#xff0c;SB也。。。转载于:https://www.cnblogs.com/Zetazzz/archive/2011/01/30/1948082.html

LeetCode实战:二叉树的最大深度

题目英文 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. Note: A leaf is a node with no children. Example: Given binary tree [3,9,20,null,n…

jfinal整合shiro回顾

2019独角兽企业重金招聘Python工程师标准>>> 目前jfinal使用shiro进行身份验证和授权的后台实现已完成&#xff0c;现在我再来总结下学习过程及代码实现过程。最近半年多项目开发都用.net&#xff0c;但又不甘心用了一年多的java&#xff0c;jfinal就这样被废弃&…

零基础学习Java培训有什么攻略

零基础学习Java培训有什么攻略?java是主流编程语言之一&#xff0c;我们在学习Java的时候需要制定Java学习路线图&#xff0c;Java涉及到的知识点非常的多&#xff0c;我们该从何学起呢?怎么系统的学习呢?来看看下面的详细介绍。 一、Java学习阶段 将Java学习过程分为3个阶段…

php去掉字符串的最后一个字符 substr()的用法

今天项目中用到&#xff0c;去掉字符串中的最后一个字符原字符串1,2,3,4,5,6,去掉最后一个字符","&#xff0c;最终结果为1,2,3,4,5,6代码如下&#xff1a;$str "1,2,3,4,5,6,"; $newstr substr($str,0,strlen($str)-1);echo $newstr;系统自带的函数也可…

如何加入LSGO软件技术团队?

背景 马上就要放暑假了&#xff01; LSGO软件技术团队 也要开始招新了&#xff01; 本次招入的同学&#xff0c;我会亲自来带&#xff0c;和你一起学习&#xff0c;共同成长。 我们的主要研究方向是机器学习&#xff0c;再详细一些就是视觉、自然语言处理和量化金融。 以下是…

《MySQL技术内幕:InnoDB存储引擎》读书笔记

2019独角兽企业重金招聘Python工程师标准>>> 1.InnoDB中每一页的大小默认为16kb&#xff0c;但是其也支持压缩页的功能&#xff0c;即将原本16kb的页压缩为1kb、2kb、4kb和8kb。当需要从缓存池中申请4kb大小的页时&#xff0c;MySQL的申请步骤如下&#xff1a; 检查…

UI设计要做什么,UI设计培训都要学什么

UI设计要做什么&#xff0c;UI设计培训都要学什么?相信有很多人都对这个问题比较感兴趣&#xff0c;近几年&#xff0c;UI设计被越来越多的人关注&#xff0c;行业薪资水平也是一路飙升&#xff0c;很多人都在准备学习UI设计&#xff0c;那么具体的内容&#xff0c;下面我们来…

[置顶] 如何搭建一个 Data Guard 环境

在Blog里零零散散的讲了一些DB 维护的东西&#xff0c;比较杂&#xff0c;也比较散。 这里就Oracle Data Guard 这块做一个小结。 主要是流程上的东西。 做个参考&#xff0c;以后装DG&#xff0c;照这个流程走就ok了。 一. 服务器设置1.1 硬盘的规划根据自己的业务量来规划硬…

技术图文:如何进行代码的重构?以封装 BigOne API 为例

背景 自从把“量化交易”作为自己精进的技术方向之后&#xff0c;我做了一些准备工作。 比如&#xff1a; 1. 爬取交易所的公告&#xff0c;根据公告的信息来研判数字货币的短期走势。 这里面有一个“流动性溢价”的概念&#xff0c;等后面我会结合一些例子跟大家聊聊这块的…

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.7.5 使用StAX写出XML文档

3.7.5 使用StAX写出XML文档 在前一节中&#xff0c;你看到了如何通过写出DOM树的方法来产生XML文件。如果这个DOM树没有其他任何用途&#xff0c;那么这种方式就不是很高效。StAX API使我们可以直接将XML树写出&#xff0c;这需要从某个OutputStream中构建一个XMLStreamWriter…