本书基于C#语言介绍网络爬虫开发的基本原理、技巧和应用实例,适合网络爬虫开发的爱好者和研究者阅读。读者*好具备一定的编程基础,或者正在学习C#编程,以便更好地理解本书的内容。
本书具有以下特点:
1)内容简明、由浅入深。本书不追求内容上的面面俱到,而是围绕网络爬虫的核心环节,介绍其基本原理和实现方法,并进行适当的功能扩展。与其他同类书籍相比,本书篇幅适中,适合初学者阅读。
2)实例丰富,代码翔实。书中尽量选择逻辑简明、功能完整的典型实例,从需求、设计、实现的角度分别进行介绍。而且,几乎所有实例都给出了主要实现代码,并对关键代码进行了详细注释,方便读者进行实践。
前 言
虽然Python爬虫依靠强大的第三方库能够快速实现某些特定功能,但由于这些库封装的层次较高,隐藏了大量内部细节,使用者往往知其然而不知其所以然,遇到问题难以延展。学习基于C#的爬虫开发虽然起步稍慢,但能够更好地理解底层网络原理和爬虫架构;借助强大的VS平台和C#优秀的语言特性,更容易开发出专业级的可视化爬虫工具。相对于Python的“人生苦短”,我们追求的是“诗和远方”。
本书基于C#语言介绍网络爬虫开发的基本原理、技巧和应用实例,适合网络爬虫开发的爱好者和研究者阅读。读者要是具备一定的编程基础,或者正在学习C#编程,能更好地理解本书的内容。
本书具有以下特点:
1)内容简明、由浅入深。本书不追求内容上的面面俱到,而是围绕网络爬虫的核心环节,介绍其基本原理和实现方法,并进行适当的功能扩展。与其他同类书籍相比,本书篇幅适中,适合初学者阅读。
2)实例丰富,代码翔实。书中尽量选择逻辑简明、功能完整的典型实例,从需求、设计、实现的角度分别进行介绍。而且,几乎所有实例都给出了主要实现代码,并对关键代码进行了详细注释,方便读者进行实践。
全书共分11章。第1章介绍网络爬虫的基础知识,包括网络、网页和爬虫概述;第2章简要介绍C#编程,并侧重与网络爬虫相关的内容;第3章介绍网络资源下载的方法,并实现通用资源下载器;第4章介绍网页数据抽取的方法,重点实现HTML解析器;第5章介绍XML和JSON数据抽取的方法,从而获得更丰富的目标数据;第6章介绍爬虫数据的存储,从而将采集结果保存到文件或数据库;第7章介绍网络爬虫的搜索方式,包括深度优先搜索和广度优先搜索,并实现爬虫控制器;第8章介绍多线程爬虫,并实现自定义线程池以提高爬虫效率;第9章介绍如何使用代理服务器,并实现自定义代理池;第10章介绍常见的浏览器内核,以及如何使用GeckoFx模拟浏览器获取深层数据;第11章介绍抽取模板的表示、管理以及可视化配置方法。
由于网站更新,一段时间后实例中的某些URL链接可能会失效,部分网页结构也会发生变化,此时相关实例需要做相应的代码调整才能正确运行。技术是中立的,本书所述内容仅用于技术交流,任何人若将相关技术用于商业或其他用途,需自行承担由此产生的影响和后果。
致谢
在本书即将出版之际,首先感谢我的合作者种惠芳老师,种老师专业过硬、认真负责,承担了大量撰写工作;特别感谢恩师张克亮教授一直以来对我的指导和鼓励;感谢易绵竹教授、马延周副教授、唐亮副教授、王亚利副教授对本书提出的许多宝贵意见;感谢任静静老师、张婷老师、沈丽民老师、王帅鸽老师参与了本书初稿的校对。最后,感谢我的妻子赵盼,她对家庭双倍的付出才让我有时间完成本书。
限于作者的学识,书中难免有表述不当或疏漏之处,恳请各位读者指正。
李健
2022年5月
目 录
前言
第1章 网络爬虫概述1
1.1 网络基础1
1.1.1 网络的基本概念1
1.1.2 HTTP6
1.1.3 会话机制11
1.2 网页知识14
1.2.1 HTML14
1.2.2 CSS17
1.2.3 JavaScript20
1.3 网络爬虫的原理22
1.3.1 网络爬虫概述22
1.3.2 Robots协议25
1.3.3 网络爬虫框架29
第2章 C#编程基础31
2.1 C#语言概述31
2.1.1 C#与.NET框架31
2.1.2 开发环境33
2.1.3 语言生态37
2.2 数据和运算40
2.2.1 C#数据类型40
2.2.2 常用运算符45
2.3 流程控制50
2.3.1 分支结构51
2.3.2 循环结构54
2.4 常用数据结构56
2.4.1 字符串56
2.4.2 数组60
2.4.3 列表62
2.4.4 字典65
第3章 网络资源下载70
3.1 同步下载70
3.1.1 网页下载70
3.1.2 编码检测72
3.1.3 参数设置76
3.2 异步下载83
3.2.1 实现方式83
3.2.2 性能分析85
3.3 通用资源下载器 86
3.3.1 下载器的设计86
3.3.2 下载器的实现88
第4章 网页数据抽取95
4.1 正则表达式抽取95
4.1.1 正则表达式简介95
4.1.2 使用Regex类97
4.2 XPath抽取100
4.2.1 XPath简介100
4.2.2 使用HtmlAgilityPack103
4.3 HTML解析器107
4.4 综合实例:新闻资讯爬虫110
4.4.1 爬虫设计110
4.4.2 爬虫实现111
第5章 其他数据抽取119
5.1 XML数据抽取119
5.1.1 XML简介119
5.1.2 使用System.Xml120
5.2 JSON数据抽取123
5.2.1 JSON简介123
5.2.2 使用Newtonsoft.Json125
5.3 综合实例1:天气爬虫128
5.3.1 问题描述与分析128
5.3.2 爬虫设计131
5.3.3 爬虫实现131
5.4 综合实例2:音乐爬虫136
5.4.1 问题描述136
5.4.2 逆向分析138
5.4.3 爬虫设计141
5.4.4 爬虫实现143
第6章 数据存储150
6.1 数据的维度150
6.2 文件存储151
6.2.1 低维数据存储151
6.2.2 高维数据存储154
6.3 数据库存储158
6.3.1 MySQL的安装和配置158
6.3.2 将数据存入MySQL162
第7章 爬虫控制167
7.1 爬虫搜索方式167
7.1.1 深度优先搜索167
7.1.2 广度优先搜索171
7.1.3 性能分析172
7.2 爬虫控制器175
7.2.1 控制器设计175
7.2.2 控制器的实现176
7.2.3 实时控制器179
7.3 综合实例:站内文章爬虫183
7.3.1 爬虫设计183
7.3.2 爬虫实现185
7.3.3 爬虫测试186
第8章 多线程爬虫189
8.1 多线程机制189
8.1.1 Thread对象189
8.1.2 BackgroundWorker控件192
8.1.3 系统线程池194
8.2 多线程爬虫197
8.2.1 实现方法197
8.2.2 性能对比199
8.3 自定义线程池202
8.3.1 线程池设计202
8.3.2 线程池实现203
8.3.3 性能测试206
8.4 多线程爬虫控制器207
8.4.1 多线程控制器实现207
8.4.2 访问序列分析210
第9章 使用代理213
9.1 代理机制213
9.1.1 使用WebProxy对象213
9.1.2 使用全局代理215
9.2 自定义代理池217
9.2.1 代理池设计217
9.2.2 代理池实现218
第10章 模拟浏览器225
10.1 浏览器的工作原理225
10.1.1 网页解析过程225
10.1.2 常见的浏览器内核226
10.2 使用浏览器内核226
10.2.1 Trident内核226
10.2.2 Gecko内核231
10.3 综合实例:网页翻译爬虫240
10.3.1 问题描述240
10.3.2 爬虫设计241
10.3.3 爬虫实现242
10.3.4 算法改进247
第11章 可视化模板配置250
11.1 可视化模板配置方法250
11.1.1 抽取原理250
11.1.2 模板表示253
11.1.3 可视化配置254
11.2 综合实例:可视化网页文章
爬虫259
11.2.1 爬虫设计259
11.2.2 爬虫实现260
参考文献264