如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!
当前,信息技术领域的知识在飞速的更新。作为一个程序爱好者,或者说已经超过 10年 的老码农,稍有懈怠就会被落下!跟踪当前信息技术领域的畅销书,结合自己所做的事情买来阅读,以便提升技能,就显得非常重要了。
今天我就为大家介绍如何利用 C# 语言来爬取“京东 - 计算机与互联网图书销量榜”。
我们先来看一下这个网页:
https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-1002-1#comfort
当我们点击“第2页”时,我们发现URL
变成:
https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-1002-2#comfort
以此类推,页码的变化会导致客户端请求参数category
的变化,即3287-0-0-0-1002-1
、3287-0-0-0-1002-2
……,这样我们就找到了要爬取网页的规律。
我们再来看一下,网页的源代码:
可以发现,我们所要的数据全部在li
标签中的class='p-detail'
中,我们只要把这个网页的HTML DOM
节点得到,在用“选择器”把对应的部分提取出来就可以了。
这里推荐一个处理HTML DOM
的开源工具:Jumony,可以在 Github 上下载。
下载地址为:
https://github.com/Ivony/Jumony
这里对HTML DOM
开源工具不做过多介绍,要是大家感兴趣,我后面再写几篇图文来介绍这个工具。
网页分析部分介绍完了,下面我们介绍代码部分。
1. 定义存储图书的结构 Book
,代码如下:
public class Book
{/// <summary>/// 获取或设置 销量排名/// </summary>public int Num { get; set; }/// <summary>/// 获取或设置 书名/// </summary>public string Title { get; set; }/// <summary>/// 获取或设置 作者/// </summary>public string Author { get; set; }/// <summary>/// 获取或设置 出版社/// </summary>public string Press { get; set; }/// <summary>/// Book实例的格式化输出/// </summary>/// <returns>Markdown格式文本</returns>public override string ToString(){string num = Num.ToString().PadLeft(2, '0');string temp = "**Top" + num + ":" + Title.Trim() + "**" + Environment.NewLine+ "- 作 者:" + Author + Environment.NewLine+ "- 出版社:"+Press;return temp;}
}
2. 获取“京东 - 计算机与互联网图书销量榜”网页的 HTML结构 的代码如下:
public static IHtmlDocument GetHtmlDocumentJd(int page)
{string url = "https://book.jd.com/booktop/0-0-0.html?"+ "category=3287-0-0-0-1002-"+ page+ "#comfort";IHtmlDocument document;try{document = new JumonyParser().LoadDocument(url);}catch{document = null;}return document;
}
3. 获取“京东 - 计算机与互联网图书销量榜”内容的代码如下:
public static List<Book> GetBooksJd(int page)
{IHtmlDocument doc = GetHtmlDocumentJd(page);if (doc == null)return null;List<Book> result = new List<Book>();List<IHtmlElement> lists = doc.Find(".p-detail").ToList();for (int i = 0; i < lists.Count; i++){Book book = new Book();book.Num = i + 1;List<IHtmlElement> s = lists[i].Find("a").ToList();//得到书的名字book.Title = s[0].InnerHtml().Trim(); List<IHtmlElement> infor = lists[i].Find("dl dd").ToList();List<IHtmlElement> authors = infor[0].Find("a").ToList();if (authors.Count > 1){string temp = infor[0].InnerHtml().Remove(0, 2).Trim();int index = temp.IndexOf("<a", StringComparison.Ordinal);string country = temp.Substring(0, index).Trim();string author1 = authors[0].InnerHtml().Trim(); // 著string author2 = authors[1].InnerHtml().Trim(); //译book.Author = country + " " + author1 + " 著 " + author2 + " 译";}else{book.Author = authors[0].InnerHtml().Trim() + " 著"; //得到作者的名字}//得到出版者的名字book.Press = infor[1].Find("a").ToList()[0].InnerHtml().Trim();result.Add(book);}return result;
}
4. 获得 Markdown
格式的字符串方法如下:
private void btnSpider_Click(object sender, EventArgs e)
{List<Book> books = BooksHtmlDocument.GetBooksJd(1);string str = "---" + Environment.NewLine + "### 京东"+Environment.NewLine;for (int i = 0; i < books.Count; i++){str += Environment.NewLine+books[i] + Environment.NewLine;}
}
5. 解析Markdown
格式的文本为HTML
格式文本的结果如下:
好了,到这里就基本介绍完毕了。
我在图文 计算机书籍每周销量排行榜 中的“京东”部分就是这样完成的,避免了Ctrl+C
和Ctrl+V
的尴尬,提升了工作效率。
是不是很有趣,你也来试试吧!See You!
参考图文:
- 如何做一款「桌面版百度翻译」软件
- 七天学会「股票数据分析软件」的开发(上)
- 七天学会「股票数据分析软件」的开发(中)
- 七天学会「股票数据分析软件」的开发(下)
相关文章:

突发!微信官方证实:“绞杀”了刷量平台
今天,有关微信刷量平台崩溃的新闻刷爆朋友圈。在朝阳群众的“深扒”之下,不少微信大号的惨淡阅读量展露出了“娇羞的真容”。 不过,对此事,微信官方一直保持了“可怕的沉默”,今天下午,微信终于做出了官方回…

Java培训一共分几个阶段
Java培训一共分几个阶段?一般培训机构的课程都是从基础知识讲起,千锋教育的Java培训课程也不例外,第一阶段为JavaEE基础,主要讲授Java基础语法、面向对象、核心类库、集合等等基础知识点,把基础打牢学习接下来的知识的时候才会更…

IE6,7,8,FF兼容总结
做到浏览器兼容需要注意的四大要素(一)2009-05-31 17:091 Css1.1 选择器 通配符 * :: IE6不支持类选择器 .class :: IE6元素的class不能超过2个属性选择器 [attvalue] [att] [att|value] [att(^|$|~)value] :: IE6不支持关系选择器 E F; E > F ; E ~ F :: IE6不支持 1.2 伪…

二叉树的路径(根节点到叶节点)Binary Tree Paths
为什么80%的码农都做不了架构师?>>> 问题: Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1/ \ 2 3\5 All root-to-leaf paths are: ["1->2->5", "1->…

股市币市:数据分析与交易所公告(20190226)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源: https…

零基础怎么学UI设计
互联网的快速发展,给很多企业和求职人员有了更多的创业和工作机会,近几年,UI设计行业招聘需求人数就在不断上涨,越来越多的人想转行做UI设计。那么零基础怎么学UI设计?有哪些简单有效的学习方法?我们来看看下面的详细介绍。 零基…

原创:嵌入图片的HTML内容在FLASH AS3中正确显示的最佳解决方案
做一个项目,遇到这个该死的问题,尝试了几乎所有解决方法,几近崩溃,终于找到完美解决方案。因为在网上,无论中文还是英文,搜索了无数遍,都没人给出正确答案,所以,在此记下…

总结六条对我们学习Linux系统有用的忠告
接触linux需要的是端正自己的态度,这个玩意可不是一天两天就能拿得下的。学习个基础,能装系统、能装常见服务、能编译、能配置存储空间、能配置系统参数、能简单查看系统负载等基本够用。但这些只保证能做机房运维,真正和进阶的运维工作不在机…

一份来自上海院校的考研预调剂系统已开放名单!
距离 19 考研初试成绩的公布已经有一段时间了,成绩不错的同学就安心准备复试吧,全力备考,一定要拿到属于你的录取通知书!成绩不满意,擦线或者排名靠后的同学,复试、调剂两手准备,注定咱们要花更…

【Python培训基础知识】Python生成器函数
对于程序而言,内存也是很重要的,因为程序中很多数据都是保存在内存中的,如果内存中存储的数据过多,那么系统就会崩溃,这是人们不希望发生的。 可以采用生成器推导式来解决内存不足的问题。例如,利用生成器推…

普华永道重磅报告:决定未来的八大核心科技
在新兴科技高速发展的今天,各个技术风口你方唱罢我登场,把我们裹挟其中,无论是创业者,还是大公司的决策人,都需要时刻判断趋势。 也许每个人心里都在想类似的问题:“这些人工智能技术会如何影响我们的物联网…

[转帖][实用]Linux 释放内存方法
先看看内存使用状况[rootnode1 ~]# free -mtotal used free shared buffers cachedMem: 8004 6557 1446 0 163 5630-/ buffers/cache: 763 7240Swap: 1983 0 1983把内存里的数据暂时写到硬盘里[rootnode1 ~]# sync修改 /proc/sys/vm/drop_caches文件[rootnode1 ~]# echo 3 >…

股市币市:数据分析与交易所公告(20190227)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源: https…

【Web前端培训】预解析(变量提升)
今天千锋小编为大家介绍一下一下JavaScript中的预解析(变量提升)。从什么是预解析及变量的预解析和函数的预解析及加载流程进行学习(注意:我们这里说的ES5中的预解析)。 什么是解析 首先代码执行肯定需要一个执行环境,浏览器会提供一个供javaScript执行的…

如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
我们生活在一个快节奏的时代里,每天除了辛苦的提升自己,为生活打拼之外,偶尔的放松去看场电影也是必要的。可是能够抽出的时间有限,选择看哪部电影就是一个挠头的问题了。 幸好,有类似猫眼电影、豆瓣电影、淘票票这样…
【Java学习笔记之五】java数组详解
数组 概念 同一种类型数据的集合。其实数组就是一个容器。 数组的好处 可以自动给数组中的元素从0开始编号,方便操作这些元素。 格式1: 元素类型[] 数组名 new 元素类型[元素个数或数组长度]; 示例:int[] arr new int[5]; 格式2&…

参加Java培训需要注意什么
java编程语言对于零基础的同学来说,想要自学是非常困难的,因为java学习包含很多阶段,所以零基础的小白和初学者报java培训班学习是非常有必要的,下面小编就给大家详细的介绍一下参加Java培训需要注意什么? 参加Java培训需要注意什…

写得不错的几篇C/C++博客
转:http://blog.csdn.net/rubyzhudragon/category/562309.aspx 转载于:https://www.cnblogs.com/xinzhuangzi/archive/2010/08/22/4100543.html

股市币市:数据分析与交易所最新公告(20190228)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源: https…

优化webpack配置
happypack happypack可以加快rebuild的速度 在开发的时候,需要将babel-loader替换成happypack/loader{test: /\.(js|jsx)$/,exclude: /(node_modules|vendor)/,loader: isDev ? happypack/loader : babel-loader } 同时添加插件, 根据需要定义不同的babel配置&…

Java多线程学习处理高并发问题
在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将…

防止表单多次提交
防止表单多次提交 //jQuery①<script type"text/javascript"> $("input:submit").each(function() { var srcclick $(this).attr("onclick"); if(typeof(srcclick)"function"){ $(this).click(function() { if (srcclick()) { …

Visual Studio环境变量使用实例:使用环境变量来组织project
前言 在前一篇文章Visual Studio中的环境变量(以Visual Studio 2013为例)中介绍了VS中的环境变量,本文将以实际样例说明怎样合理使用这些环境变量来组织VCproject。使用vs环境变量来组织project 通常一个解决方式包括多个项目。这些项目相互之间可能存在依赖关系。以…

股市币市:数据分析与交易所最新公告(20190301)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源: https…

Python常用6个技术网站汇总分享!
Python是一门面向对象的编程语言,它具有丰富和强大的库,能够把用其他语言编写的各种模块轻松地联结在一起,因此也常被称为“胶水语言”。Python技术会随着互联网的不断发展一直迭代和更新,所以需要Python开发的人员一直保持一个学…

devstack —— 单机部署 OpenStack 体验
2019独角兽企业重金招聘Python工程师标准>>> devstack 是一个用来快速部署 OpenStack 的脚本。 使用非常简单,执行 ./stack.sh 即可,但是在安装过程中遇到一些问题会中断,通过不断修正尝试,事后在这里记录一下…

使用ultraedit和cl编译器打造简易c/c++开发环境
在visual c下,每编写一个简单的小程序,就得生成一大串中间文件,另人十分的不爽。下面提供一个新的编写c/c程序的方法: (1),下载utraledit-32编辑器,推荐v11. (2&a…

股市币市:数据分析与交易所最新公告(20190302)
BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源: https://coinmarketcap.com/currencies/bitcoin/ 数字货币交易所公告 BigOne 2019/03/01 BigONE 用户体验月:有奖寻建议 ,重金找 BUG …

分享五款java学习辅助工具,总有你用的上的~
想要学好java技术,除了自身的努力,辅助工具也不缺少,辅助工具可以帮助大家在今后的工作中可以提高工作效率,下面小编就来分享五款java学习辅助工具,总有你用的上的~ 五款java学习辅助工具: 1、Eclipse Ecli…

如何利用 C# 爬取「猫眼电影专业版:票房」数据!
在现代生活中,看电影已经成为大家的一种休闲方式。 前几天,我们介绍了 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!,通过这份“热映口碑”榜单,我们可以看到大家对当前热播电影的评价&#x…