一.介绍一个Http请求框架HttpCode.Core

HttpCode.Core 源自于HttpCode(传送门),不同的是 HttpCode.Core是基于.net standard 2.0实现的,移除了HttpCode与windows相耦合的api,且修改了异步实现,其余特性完全与HttpCode相同,大家 如果在使用中有什么问题可以查看在线文档(传送门)

HttpCode.Core完全开源,已传到github,地址:https://github.com/stulzq/HttpCode.Core

为了方便大家使用,也传到了nuget,地址:https://www.nuget.org/packages/HttpCode.Core/,在nuget中搜索 HttpCode.Core 或执行命令 Install-Package HttpCode.Core 就可以使用了。

具体的使用方法大家可以查阅在线文档,或者查看github。

简单、易用、高效 一个有态度的开源.Net Http请求框架!

二.分析抓取地址

首先使用谷歌浏览器的开发者工具,抓取博客园首页获取博文列表的地址:

从中我们可以分析出:

1. 请求地址  https://www.cnblogs.com/mvc/AggSite/PostList.aspx

2.请求方式  Post

3.请求数据

{

"CategoryType":"SiteHome",

"ParentCategoryId":0,

"CategoryId":808,

"PageIndex":3,

"TotalPostCount":4000,

"ItemListActionName":"PostList"

}

请求数据中,我们应当关心的是  PageIndex  代表的是 页数,我们可通过变换这个参数的值来获取不同页面的数据。

我们先使用HttpCode.Core来试一试获取数据:

int pageIndex = 1;//页数

HttpHelpers httpHelpers=new HttpHelpers();

HttpItems items=new HttpItems();

items.Url = "https://www.cnblogs.com/mvc/AggSite/PostList.aspx";//请求地址

items.Method = "Post";//请求方式 post

items.Postdata = "{\"CategoryType\":\"SiteHome\"," +

"\"ParentCategoryId\":0," +

"\"CategoryId\":808," +

"\"PageIndex\":"+ pageIndex + "," +

"\"TotalPostCount\":4000," +

"\"ItemListActionName\":\"PostList\"}";//请求数据

HttpResults hr = httpHelpers.GetHtml(items);

Console.WriteLine(hr.Html);

Console.ReadKey();

运行截图:

可以看到我们已经成功获取了数据,证明我们的分析是正确的。

三.解析返回的数据

刚刚我们测试接口返回的数据可以看出返回的是一堆html字符串。我们只想要博文的标题、作者、博文地址等等信息,我们不需要多余的html字符串,下面我们使用  HtmlAgilityPack 这个解析网页的组件来获得我们想要的数据。

关于这个组件的使用,博客园已经有不少介绍此组件的文档,大家可以搜索查看,使用此组件需具备xpath相关知识,我就不在此详细叙述了。

1.首先通过nuget安装 HtmlAgilityPack  组件

  打开程序包控制台

  执行命令 Install-Package HtmlAgilityPack -Version 1.5.2-beta6

2. 解析返回的数据

贴一下返回的部分数据:

<div class="post_item">

<div class="digg">

<div class="diggit" οnclick="DiggPost('yaoxiaowen',7470460,318439,1)">

<span class="diggnum" id="digg_count_7470460">4</span>

</div>

<div class="clear"></div>

<div id="digg_tip_7470460" class="digg_tip"></div>

</div>

<div class="post_item_body">

<h3><a class="titlelnk" href="http://www.cnblogs.com/yaoxiaowen/p/7470460.html" target="_blank">关于跨平台的一些认识</a></h3>

<p class="post_item_summary">

<a href="http://www.cnblogs.com/yaoxiaowen/" target="_blank"><img width="48" height="48" class="pfs" src="//pic.cnblogs.com/face/918357/20161122225949.png" alt=""/></a>    前段时间看了 周志明的那本 《深入理解java虚拟机》。对于 平台无关性 问题,有了一些新的认识。所以特写一篇博客来进行总结。 这是我的第一篇不针对具体技术,而只针对计算机系统和原理的博客文章,而这种话题,总是比较宽泛,而我本人的水平有限,所以我也只能泛泛的写写,思考的不对的地方,还望读者不吝批评。 ...

</p>

<div class="post_item_foot">

<a href="http://www.cnblogs.com/yaoxiaowen/" class="lightblue">eleven_yw</a>

发布于 2017-09-03 22:12

<span class="article_comment"><a href="http://www.cnblogs.com/yaoxiaowen/p/7470460.html#commentform" title="2017-09-04 15:23" class="gray">

评论(2)</a></span><span class="article_view"><a href="http://www.cnblogs.com/yaoxiaowen/p/7470460.html" class="gray">阅读(210)</a></span></div>

</div>

<div class="clear"></div>

</div>

<div class="post_item">

<div class="digg">

<div class="diggit" οnclick="DiggPost('loseheart',7471197,375716,1)">

<span class="diggnum" id="digg_count_7471197">0</span>

</div>

<div class="clear"></div>

<div id="digg_tip_7471197" class="digg_tip"></div>

</div>

<div class="post_item_body">

<h3><a class="titlelnk" href="http://www.cnblogs.com/loseheart/p/7471197.html" target="_blank">2017年9月3日  实现网站的权限管理</a></h3>

<p class="post_item_summary">

<a href="http://www.cnblogs.com/loseheart/" target="_blank"><img width="48" height="48" class="pfs" src="//pic.cnblogs.com/face/1224591/20170823222646.png" alt=""/></a>    现在各个企业管理网站对登录的账号都要进行权限管理,并且相当重要,每个账号登录进去所能看到的东西大不相同,下面是实现该功能的一个的一种方法。 需求: 权限:权限是使用者操作系统中功能模块的能力,如“角色管理”模块、“资费管 理”模块和“账单管理”模块等。通过指定权限,可将使用者的操作限定在指定的 范围 ...

</p>

<div class="post_item_foot">

<a href="http://www.cnblogs.com/loseheart/" class="lightblue">Loseheart</a>

发布于 2017-09-03 21:34

<span class="article_comment"><a href="http://www.cnblogs.com/loseheart/p/7471197.html#commentform" title="" class="gray">

评论(0)</a></span><span class="article_view"><a href="http://www.cnblogs.com/loseheart/p/7471197.html" class="gray">阅读(354)</a></span></div>

</div>

<div class="clear"></div>

</div>

从中我们不难看出每一个数据是以class=post_item的div来进行区分的,我们想要的博文地址、标题等是在这个div里面的class=post_item_body的div里面,以此类推我们可以分析出:

  • 博文标题 <div class="post_item"> | <div class="post_item_body"> | h3 | a | Text

  • 博文地址 <div class="post_item"> | <div class="post_item_body"> | h3 | a | href

  • ..以此类推

因为HtmlAgilityPack是通过xpath来解析网页的,所以现在我们要根据我们上面分析出的路径来写xpath,这里不明白xpath的可以去w3cschool学习一下,非常简单。

下面是我写好的解析博文标题、地址和作者的代码,抓取其他信息可以自己参考试一试:

//解析数据

HtmlDocument doc=new HtmlDocument();

//加载html

doc.LoadHtml(hr.Html);

//获取 class=post_item_body 的div列表

HtmlNodeCollection itemNodes = doc.DocumentNode.SelectNodes("div[@class='post_item']/div[@class='post_item_body']");

//循环根据每个div解析我们想要的数据

foreach (var item in itemNodes)

{

//获取包含博文标题和地址的 a 标签

var nodeA = item.SelectSingleNode("h3/a");

//获取博文标题

string title = nodeA.InnerText;

//获取博文地址 a标签的 href 属性

string url = nodeA.GetAttributeValue("href", "");

//获取包含作者名字的 a 标签

var nodeAuthor = item.SelectSingleNode("div[@class='post_item_foot']/a[@class='lightblue']");

string author = nodeAuthor.InnerText;

Console.WriteLine($"标题:{title} | 作者:{author} | 地址:{url}");

}

运行截图:

四.循环抓取多个分页

前面我们分析出请求参数中的 PageIndex  是页数,分析单个页面的代码我们也写出来来,那么我们可以通过循环递增页数,来达到抓取不同分页数据的要求。

贴一下完整的代码

int pageIndex = 1;//页数

int maxPageIndex = 10;//最大页数

HttpHelpers httpHelpers=new HttpHelpers();

for (int i = 0; i < maxPageIndex; i++)

{

HttpItems items = new HttpItems();

items.Url = "https://www.cnblogs.com/mvc/AggSite/PostList.aspx";//请求地址

items.Method = "Post";//请求方式 post

items.Postdata = "{\"CategoryType\":\"SiteHome\"," +

"\"ParentCategoryId\":0," +

"\"CategoryId\":808," +

"\"PageIndex\":" + (i+1) + "," + //因为i从0开始 所以此处我们要加1

"\"TotalPostCount\":4000," +

"\"ItemListActionName\":\"PostList\"}";//请求数据

HttpResults hr = httpHelpers.GetHtml(items);

//解析数据

HtmlDocument doc = new HtmlDocument();

//加载html

doc.LoadHtml(hr.Html);

//获取 class=post_item_body 的div列表

HtmlNodeCollection itemNodes = doc.DocumentNode.SelectNodes("div[@class='post_item']/div[@class='post_item_body']");

Console.WriteLine($"第{i+1}页数据:");

//循环根据每个div解析我们想要的数据

foreach (var item in itemNodes)

{

//获取包含博文标题和地址的 a 标签

var nodeA = item.SelectSingleNode("h3/a");

//获取博文标题

string title = nodeA.InnerText;

//获取博文地址 a标签的 href 属性

string url = nodeA.GetAttributeValue("href", "");

//获取包含作者名字的 a 标签

var nodeAuthor = item.SelectSingleNode("div[@class='post_item_foot']/a[@class='lightblue']");

string author = nodeAuthor.InnerText;

//输出数据

Console.WriteLine($"标题:{title} | 作者:{author} | 地址:{url}");

}

//每抓取一页数据 暂停三秒

Thread.Sleep(3000);

}

Console.ReadKey();

运行截图:

一个简单的.net core实现的简单爬虫就此完成!

原文:http://www.cnblogs.com/stulzq/p/7474334.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

.net core 实现简单爬虫—抓取博客园的博文列表相关推荐

  1. .NET Core 实现定时抓取博客园首页文章信息并发送到邮箱

    前言 大家好,我是晓晨.许久没有更新博客了,今天给大家带来一篇干货型文章,一个每隔5分钟抓取博客园首页文章信息并在第二天的上午9点发送到你的邮箱的小工具.比如我在2018年2月14日,9点来到公司我就 ...

  2. java爬虫之爬取博客园推荐文章列表

    这几天学习了一下Java爬虫的知识,分享并记录一下: 写一个可以爬取博客园十天推荐排行的文章列表 通过浏览器查看下一页点击请求,可以发现 在点击下一页的时候是执行的 post请求,请求地址为 http ...

  3. python 爬虫 博客园_Python爬虫爬取博客园作业

    分析一下他们的代码,我在浏览器中对应位置右键,然后点击检查元素,可以找到对应部分的代码.但是,直接查看当前网页的源码发现,里面并没有对应的代码.我猜测这里是根据服务器上的数据动态生成的这部分代码,所以 ...

  4. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. c#使用正则表达式获取TR中的多个TD_[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例...

    首先祝大家中秋节和国庆节快乐,欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都 ...

  6. java 使用webmagic 爬虫框架爬取博客园数据

    java 使用webmagic 爬虫框架爬取博客园数据存入数据库 学习记录   webmagic简介: WebMagic是一个简单灵活的Java爬虫框架.你可以快速开发出一个高效.易维护的爬虫. ht ...

  7. 使用scrapy抓取博客信息

    使用scrapy抓取博客信息 本文使用python的爬虫工具scrapy获取博客园发布的文档的信息. 创建cnblog爬虫项目: scrapy startproject cnblog 创建爬虫cnbl ...

  8. 用python,selenium抓取博客积分

    世界上最稀缺的资源是时间. 在某一瞬间我惊恐得发现,一生三万天,已过三分之一,念及年少不更事,蹉跎而过,觉得心中有愧.至今无建树,脑袋里想起一句话,"不因虚度年华而悔恨,也不因碌碌无为而羞耻 ...

  9. 利用urllib3 抓取博客列表

    利用urllib3 抓取博客列表 分析页面代码 分析正则表达式 完整代码 分析页面代码 从这段代码中可以找到很多规律,例如,每条博客的所有信息都包含在一个 <div> 节点中,这个< ...

最新文章

  1. FOPEN FUNCTION
  2. 12.多线程的实现方式、线程安全问题的产生与解决以及生产者与消费者问题
  3. div横排 html_html中两个DIV怎么横排靠齐?
  4. Win11让AMD很受伤:CPU游戏性能下降15%,官方建议暂时别升级
  5. java 容器_Java容器框架学习整理
  6. 【转】DIB位图(Bitmap)的读取和保存
  7. 【Jmeter篇】jmeter+Ant+Jenkins实现自动化测试集成(一)
  8. 区块链技术学习之-简单加密货币-高飞币
  9. (2环境架设)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  10. nginx 启动命令_Nginx实战001:Window中配置使用Nginx入门
  11. Abp vnext Web应用程序开发教程 8 —— 作者:应用程序层
  12. 台大李宏毅Machine Learning 2017Fall学习笔记 (7)Introduction of Deep Learning
  13. Failed to connect to bitbucket.org port 443: Operation timed out
  14. STL源码剖析 第5章 关联式容器
  15. python爬取新浪博客_python爬取韩寒博客的实例
  16. 期货资管系统-分仓系统-反向跟单系统
  17. 复杂性思维中文第二版 五、细胞自动机
  18. K-mer特征提取one-hot编码
  19. kali虚拟机系统无法联网;apt-get时无法解析域名
  20. 简述观察法的优缺点_各种观察法的优缺点

热门文章

  1. Android SQLite (一) 数据库简介
  2. 媒体应用大数据,先解决三大难题
  3. Mybatis常用总结:参数,返回,执行sql,include等
  4. 自动布局AutoLayout
  5. Oracle索引扫描四大类的分析
  6. Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...
  7. Insus Binary Utility
  8. 张亚勤:PC之外的争夺战
  9. IA-32系统编程指南 - 第三章 保护模式的内存管理【2】
  10. 网络工程师必须懂的十五大专业术语!