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

如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!

前段时间我们介绍了如何利用 C# 语言来爬取“京东 - 计算机与互联网图书销量榜” 网页的方法,通过该方法,我们能够获得“京东”的图书销售排行榜数据。

可是,读书相当于给我们的大脑喂料,只有输入的是精华,才会有更好的输出。所以,仅仅有“京东”的数据还是不够的,或者说是片面的。我们需要扩展数据源,而说到图书购买,我们自然会想起“当当网”。今天我就带着大家来爬取“当当 - 计算机与互联网图书销量榜”的数据。


爬取数据之前,我们先来分析一下原网页,网址如下:

http://bang.dangdang.com/books/bestsellers/01.54.00.00.00.00-recent7-0-0-1-1

当当网页

当我们点击“第2页”时,网址变化为:

http://bang.dangdang.com/books/bestsellers/01.54.00.00.00.00-recent7-0-0-1-2

对比两个请求的 URL,发现变化的仅仅是最后一位的数字,这样我们就得到了爬取榜单的网络地址。

接下来,我们看一下网页对应的源代码:

当当源代码

从源代码中我们发现所要的数据存放在 .bang_list > li 内的 .class > a.publisher_info > a 标签中。只要通过“选择器”找到这两个标签,就可以得到我们所要的数据。


通过上面的分析,我们只要通过给定的 URL 得到“当当 - 计算机与互联网图书销量榜”网页的 HTML DOM TREE,然后进行解析找到对应的数据就可以了。这里,我们推荐一套处理HTML DOM TREE的开源工具 Jumony,可以在 Github 上下载。

Jumony下载

下载地址为:

https://github.com/Ivony/Jumony

这里对 Jumony 就不做过多介绍了,要是大家感兴趣,可以在图文下方留言,我后面再写几篇图文来介绍这个工具。


到此为止,网页分析、所用工具已经介绍完了,下面介绍一下我们写的代码。

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>/// 获取或设置 来源/// </summary>public string Source { 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 DOM TREE

public static IHtmlDocument GetHtmlDocumentDd(int page)
{string url = "http://bang.dangdang.com/books/bestsellers/"+ "01.54.00.00.00.00-"+ "recent7-0-0-1-"+ page;IHtmlDocument document;try{document = new JumonyParser().LoadDocument(url);}catch{document = null;}return document;
}

3. 解析HTML DOM TREE得到存储图书的链表List<Book>

public static List<Book> GetBooksDd(int page)
{IHtmlDocument doc = GetHtmlDocumentDd(page);if (doc == null)return null;List<Book> result = new List<Book>();List<IHtmlElement> lists = doc.Find(".bang_list > li").ToList();for (int i = 0; i < lists.Count; i++){Book book = new Book();book.Num = i + 1;book.Source = "当当网";List<IHtmlElement> s = lists[i].Find(".name > a").ToList();//得到书的名字book.Title = s[0].Attribute("title").AttributeValue.Trim(); List<IHtmlElement> infor = lists[i].Find(".publisher_info > a").ToList();//得到作者的名字book.Author = infor[0].Attribute("title").AttributeValue.Trim(); //得到出版者的名字book.Press = infor[infor.Count-1].InnerHtml().Trim(); result.Add(book);}return result;
}

4. Markdown格式化输出存储图书的链表。

private string GetReport(string name, List<Book> lst)
{string result = Environment.NewLine + "---" + Environment.NewLine+ "### " + name + Environment.NewLine;for (int i = 0; i < lst.Count; i++){result += Environment.NewLine + lst[i] + Environment.NewLine;}return result;
}

5. Markdown文本格式渲染。

当当结果


最后,我们再来总结一下。

通过对“当当 - 计算机与互联网图书销量榜”的网页分析,我们确定了爬取网页的 URL 地址结构,利用 Jumony 开源工具得到该网页的 HTML DOM TREE,使用选择器得到对应的图书数据集合,最后格式化输出为 Markdwon 文本。经过渲染可以构成我们每周推荐的 计算机书籍每周销量排行榜 的“当当网”部分。怎么样,是不是很有趣。大家来试试看,今天就到这里吧, See You!


参考阅读

  • 如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!
  • 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
  • 如何利用 C# 做一款「桌面版百度翻译」软件
  • 七天学会「股票数据分析软件」的开发(上)
  • 七天学会「股票数据分析软件」的开发(中)
  • 七天学会「股票数据分析软件」的开发(下)

相关文章:

【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题

foreach语句使用总结增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量,这个局部变量的类型与part2中的对象元素的类型是一致的. part3当然还是循环体. foreach语句是java5的新特征之一&#xff0c;在遍历数组、集合方面&…

参加软件测试培训需要学什么技术

软件测试这项技术在几年可谓是风头正盛&#xff0c;很多人都想要跳槽到这个行业&#xff0c;那么就需要学会软件测试技术&#xff0c;那么目前参加软件测试培训需要学什么技术呢?来看看下面的详细介绍吧。 参加软件测试培训需要学什么技术? 每个软件在上线之前都离不开重重测…

程序集和应用程序域

这两个概念是DotNet程序员经常见到的&#xff0c;但好多人搞不清它们。虽然MSDN对它们有相关的说明&#xff0c;但并不是那么容易看懂。在这里灰灰虫根据自己的理解用简单易懂的语言解绍一下它们。程序集(assembly) “程序集是包含编译好的、面向.NET Framework的代码的逻辑…

股市币市:数据分析与交易所最新公告

投资原则&#xff1a; 极端牛市是攒钱的时候&#xff08;分位数达到100&#xff09;&#xff0c;极端熊市是攒票的时候&#xff08;分位数低于40%&#xff09;&#xff0c;股指已经屡创新高&#xff0c;你再不攒钱就不对了&#xff0c;同理&#xff0c;股指屡创新低&#xff0c…

OpenGL学习(hello)

#include <gl/glut.h>void display(void){glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲以及深度缓冲glColor3f(1.0, 1.0, 1.0);glBegin(GL_POLYGON); // 绘画開始话多边形/*glVertex3f(0.25, 0.25, 0.0);glVertex3f(0.75, 0.25, 0.0);glVertex3f(0.75, 0.75, 0.0);glV…

选择python培训机构的关键考核五大因素,让你永不吃亏!

近几年&#xff0c;对于Python技术在人工智能领域的广泛使用&#xff0c;想要学习Python技术的人越来越多&#xff0c;市面上的Python培训机构也多了起来&#xff0c;如何选择适合的Python培训机构成了困扰大家的问题&#xff0c;下面小编就我大家详细的解析一下选择python培训…

Maven 的classifier的作用

直接看一个例子&#xff0c;maven中要引入json包&#xff0c;于是使用了 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.2.2</version> </dependency> 可是&#xff0c;当…

NPOI 导出Excel

找到dll文件引用 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.IO;namespace NPOI.WriteExcel {class Program{/*NPOI.DLL&#xff1a;NPOI 核心函式庫。NPOI.DDF.DLL&#xff1a;NPOI 繪圖區讀寫函式庫。NPOI.HPSF.DLL&#xff1a;NPOI 文…

如何利用 C# 实现 K 最邻近算法?

众所周知&#xff0c;电影可以按照题材分类&#xff0c;然而题材本身是如何定义的&#xff1f;由谁来判定某部电影属于哪个题材&#xff1f;也就是说同一题材的电影具有哪些公共特征&#xff1f;这些都是在进行电影分类时必须要考虑的问题。没有哪个电影人会说自己制作的电影和…

参加java培训真的能学到有用的吗

java技术在互联网行业的快速发展&#xff0c;优渥的待遇&#xff0c;让很多人都想学习这项技术&#xff0c;目前市面上开设java培训的机构越来越多&#xff0c;很多人都担心参加java培训能学到知识吗?下面我们来看看具体的解析。 参加java培训能学到知识吗?在Java培训机构能不…

android自定义调节器控件 —— RegulatorView

2019独角兽企业重金招聘Python工程师标准>>> RegulatorView效果图&#xff1a; RegulatorView实现步骤&#xff1a; 1.新建java类RegulatorView.java&#xff0c;继承View类 2.定义必要基础属性&#xff0c;及为其附初始值 private final static int BTN_RADIUS20;/…

如何利用 C# 实现 K-D Tree 结构?

我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选&#xff0c;但她没有从中找到喜欢的人。经过一番总结&#xff0c;她发现曾交往过三种类型的人&#xff1a; 不喜欢的人魅力一般的人极具魅力的人 尽管发现了上述规律&#xff0c;但海…

[恩难到了]陨石的秘密

【描述】 公元19881231年&#xff0c;一颗巨大的陨石坠落在世界的政治文化中心cs。于是&#xff0c;灾难降临了&#xff0c;地球上出现了一系列反常的现象。当人们焦急万分的时候&#xff0c;一支由cs科学家组成的考察队赶到了出事地点。经过一番侦察&#xff0c;科学家们发现陨…

java培训学习阶段步骤讲解

目前的培训机构行业比较热门的IT技术就是java技术&#xff0c;java技术在近几年广受关注&#xff0c;java所涉及的技术知识也比较广泛&#xff0c;下面小编就为大家详细的介绍一下java培训学习多有哪几个阶段? java培训学习多有哪几个阶段&#xff1a; 第一阶段、Java设计和编…

资料分享:送你一本《机器学习实战》电子书!

这两天&#xff0c;各985高校发布了考研初试分数线。从中发现这两年大数据相关专业的分数线暴涨啊。没有400分估计心里都没底啊。可见大数据这个领域有多火爆&#xff01;而机器学习是我们团队的一个主要方向&#xff0c;新加入的同学通常都是从《机器学习实战》这本书开始入门…

HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Contest 5 题意&#xff1a;给出N个点的树&#xff0c;求去边的方案数使得 去边后最大匹配数是M的倍数限制&#xff1a; N<5e4, M<200 分析&#xff…

在别的电脑上运行cg程序出现错误的解决办法

错误&#xff1a;没有找到cg.dll&#xff0c;因为这个应用程序未能启动。重新安装应用程序可能会修复此问题 解决方法&#xff1a;复制cg.dll到system32 、debug中 错误&#xff1a;没有找到cgGL.dll&#xff0c;因为这个应用程序未能启动。重新安装应用程序可能会修复此问题 解…

HTML在网页设计中是什么作用?

HTML是一种超文本传输协议&#xff0c;规定了浏览器与服务端之间数据传输的格式&#xff0c;是一种标识性的代码语言&#xff0c;它的中文翻译是“超文本标记语言”&#xff0c;主要是通过HTML标签对网页中的文本、图片、声音等内容进行描述。HTML提供了许多标签&#xff0c;如…

如何实现链接只能被点击一次

有时候&#xff0c;只希望网站某个链接只能被点击一次&#xff0c;怎么做呢&#xff1f;下面给出3中方法&#xff01;第一种&#xff1a;利用JS在点击后把href变成#把taget变成空。 <p><a onclick"var that this;setTimeout(function(){that.removeAttribute(hr…

匿名类型和Object转换

.net中的匿名类型非常好用&#xff0c; 但是开发中遇到一个问题&#xff0c;当把匿名类型作为返回值的时候&#xff0c;会变成object类型&#xff0c;如果才能再转换能对应的匿名类型呢? 1 //返回匿名类型的函数, 会转换成object类型2 object ReturnAnonymous() {3 retur…

资料分享:送你一本《数据结构(C#语言版)》电子书!

对于信息类专业的学生而言&#xff0c;数据结构与算法是一门必修的课程。只有学好这门课程&#xff0c;熟练掌握线性表、栈、队列、树、图等基本结构&#xff0c;以及在这些结构上的各种算法&#xff0c;才能利用计算机去解决实际问题。 如何学好这门课程呢&#xff0c;给大家…

新手入门API测试必要了解的知识

什么是API?API是Application Programming Interface的简写。实现了两个或多个独立系统或模块间的通信和数据交换能力。 什么是API测试?API测试是不同于UI级自动化测试&#xff0c;其主要关注在系统架构的业务逻辑层&#xff0c;所以其主要关注不在于UI操作或用户感观上&#…

java监控多个线程的实现

场景&#xff1a;需要启动多线程处理事情&#xff0c;而在所有事情做完之后&#xff0c;需要修改系统状态&#xff1b;那么如何判断所有线程&#xff08;事情&#xff09;都做完了呢&#xff1f;这就需要判断所有当前运行的线程状态了。 代码 importjava.util.concurrent.Count…

如何利用 C# 实现神经网络的感知器模型?

前几天我们介绍了 如何利用 C# 对神经网络模型进行抽象&#xff0c;在这篇图文中&#xff0c;我们抽象了单个神经元 Neuro&#xff0c;网络层 Layer&#xff0c;网络结构 Network&#xff0c;激活函数 IActivationFunction&#xff0c;以及监督学习 ISupervisedLearning 和非监…

JPA增删改查,

2019独角兽企业重金招聘Python工程师标准>>> 1. //And --- 等价于 SQL 中的 and 关键字 public List<User> findByHeightAndSex(int height,char sex); 2. // Or --- 等价于 SQL 中的 or 关键字 public List<User> findByHeightOrSex(int height,cha…

Java新手会遇到的三大误区,一定要避免!

很多学习java技术的学员都是零基础学员&#xff0c;之前对java技术一点都不了解&#xff0c;所以java新手在学习java技术的时候很容易进入误区&#xff0c;下面小编分享的Java新手会遇到的三大误区&#xff0c;一定要避免! 作为目前最为广泛的网络编程语&#xff0c;Java凭借其…

[ACM] hdu 1253 胜利大逃亡 (三维BFS)

胜利大逃亡 Problem DescriptionIgnatius被魔王抓走了,有一天魔王出差去了,这但是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示成A个B*C的矩阵,刚開始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,如今知道魔王将在T分钟后…

如何利用 C# 爬取带 Token 验证的网站数据?

在对文本数据的情感分析中&#xff0c;基于情感词典的方法是最简单也是最常用的一种了。 它的大体思路如下&#xff1a; 对文档分词&#xff0c;找出文档中的情感词、否定词以及程度副词&#xff0c;然后判断每个情感词之前是否有否定词及程度副词&#xff0c;将它之前的否定…

多线程显示运行状态

最近碰见一个例子&#xff0c;Copy大文件或者网络访问的时候处理假死。 那就用多线程加个进度条(只显示运行&#xff0c;没有进度)来表示状态运行吧。好了&#xff0c;废话少说&#xff0c;上个例子。先看结果图&#xff1a; 程序说明&#xff1a; 点击Button&#xff0c;运行…

【Python培训基础知识】单例模式

单例模式是保证一个类仅有一个实例的设计模式。Windows中的任务管理器就是一个典型的单例模式软件。Windows任务管理器如图所示。 Windows任务管理器只能打开一个&#xff0c;即使用户重复打开&#xff0c;也只能获得一个实例&#xff0c;这不同于Word等软件可以打开多个实例。…