猜你喜欢
Python3网络爬虫宝典

Python3网络爬虫宝典

书籍作者:韦世东 ISBN:9787121394065
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:8031
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书从实际的爬虫业务需求延伸到知识点和具体实现,并详细介绍了其中的原理。首先带领读者领略爬虫程序的构成和完整链条,学习自动化工具的应用场景和基本使用;接着介绍了增量爬取的分类和具体实现、基于Redis 的分布式爬虫实现和基于RabbitMQ 的分布式爬虫实现,通过阅读论文和源码剖析详细介绍了高准确率的网页正文自动化提取方法;然后通过源码调试了解到与Python 项目的部署和调度相关的知识,进而动手实践,编写了一款具备权限控制、Python 通用项目部署、定时调度、异常监控和钉钉机器人消息通知的爬虫项目管理平台;最后通过解读分布式调度平台的核心架构,帮助大家了解分布式架构中最为重要的节点通信、文件同步等知识。
本书适合爬虫工程师、爬虫技术爱好者和Python 开发者阅读,也适合爬虫团队管理者、高校教师和培训机构的讲师阅读。

作者简介

韦世东,

资深爬虫工程师、2019 华为云·云享专家、掘金社区优秀作者、GitChat 认证作者、夜幕团队(Night Team)成员、《Python3 反爬虫原理与绕过实战》作者,对反爬虫和逆向有研究,精通爬虫架构设计和工程链路实践,搭建过日流量亿级的爬虫架构。


前言

前言

爬虫技术是当今数据时代不可或缺的搬运技术。爬虫技术在金融、房产、科技和贸易等领域中产生了很大的正向作用。企业日益增长的数据需求创造了非常多的爬虫岗位,Python 语言的蓬勃发展则造就了一大批优秀的爬虫工程师。

Python 语言的学习门槛低,也降低了爬虫技术的学习门槛。爬虫技术的发展与业务需求紧密相连,对于数据量大、数据质量要求高且讲求实效性的团队来说,如何在单位时间内获取到更多数据以及如何确保数据源的稳定性和准确率是一个不小的挑战。其中涉及时间复杂度、空间复杂度、高效率、高可用、高准确率和高稳定性等诸多知识。很多开发者学习爬虫技术时会有“很容易”的感觉,但在实际工作中却处处

碰壁,每天都会遇到各种各样的技术挑战。因此,爬虫技术的学习门槛低,但技术上限非常高,工资上限也非常高。

爬虫是一门综合技术,你不仅要学习如何发出网络请求、如何解析网页文本、如何将数据保存到数据库中,还需要掌握能显著提高单体爬取效率的异步I/O 知识、能在单位时间内获取到更多数据的分布式爬虫相关知识、保证数据源稳定性的爬虫设计、高准确率的网页正文自动化提取方法、在贴近业务需求情况下优选的有效降低时间复杂度和空间复杂度的方法,以及分布式结构下多个节点通信、文件同步等。

本书内容均来自实际的业务需求,大部分都是爬虫工程师正面临的问题。我希望通过梳理和总结以往工作中的经验,帮助更多开发者了解并掌握在实际工作中需要用到的与爬虫技术相关的知识。

本书内容

本书共6 章,各章内容归纳如下。

第1 章介绍了爬虫程序的构成和完整链条。首先从一个简单的爬虫程序开始,学习了爬虫工程师常用的网络请求库和文本解析库;然后学习如何将数据分别存入MySQL 数据库、MongoDB 数据库、Redis 数据库和Excel 文件;最后以电子工业出版社新闻资讯页爬虫为例,演示了分析、发出网络请求、解析文本和数据入库的完整流程,这为我们后面的学习打下了坚实的基础。

第2 章介绍了自动化工具的使用。首先通过一个真实的需求案例了解爬虫工程师为什么需要自动化工具,然后介绍了WebDriver 的相关知识,学习了爬虫工程师常用的两款自动化工具——Selenium 和Pyppeteer 的基本使用。在2.2 节我们学习App 自动化工具的知识和基本使用,并动手实现了对App 文字内容和图片内容的爬取。

第3 章介绍了增量爬取的原理与实现。我们从一个真实的爬取需求了解到增量爬取的必要性,然后学习增量爬取的分类和不同增量类型的实现原理。要做增量爬取必然要考虑增量池的时间复杂度或空间复杂度,在3.2 节中我们通过一个实际的需求延伸到增量池的时间复杂度和空间复杂度,并从准确的数值中找到合适的增量实现方式。

由于Redis 的高性能,很多爬虫工程师都会选择Redis 作为URL 增量池,这时候我们不得不考虑Redis 数据持久化的方案,3.3 节介绍了Redis 持久化方式的分类和特点,并动手实践了不同类型的持久化。

第4 章介绍了分布式爬虫的设计与实现。面对海量的数据或者紧迫的时间,我们需要寻找一种稳定、高效的爬取方法,分布式爬虫无疑是我们的最佳选择。在4.1 节中,我们通过实际的需求案例了解爬虫工程师为什么需要分布式爬虫、分布式爬虫的原理、分布式爬虫的分类和共享队列的选择等。在4.2 节中,我们剖析了爬虫业内著名的Scrapy-Redis 库的源码,从而了解到分布式爬虫具体的工程实现。通过第2 章的

学习,我们了解到Redis 在分布式爬虫结构中的应用,于是在4.3 节中我们动手实现了对等分布式爬虫和主从分布式爬虫。相对于Redis 来说,消息中间件能够确保每一条消息都能被消费,不会产生数据丢失的情况,这使得消息中间件受到很多中高级爬虫工程师的青睐,于是在4.4 节中我们学习并动手实践基于消息中间件应用RabbitMQ的分布式爬虫。

第5 章介绍了网页正文自动化提取方法。以往我们讨论的都是针对单个网站的聚焦爬虫,每个网站的页面在解析时都需要有一套对应的解析规则,但如果你的上司要求你爬取1000 个网站,你该怎么办呢?这时候你需要一个能够帮助你自动识别和提取网页正文的工具——Readability。在5.1 节中,我们学习爬虫业内著名的网页正文提取工具Readability 的基本使用,并体验到它那“令人惊叹”的正文提取效果。这时候你肯定会好奇,这种工具如何判断哪部分内容是广告,哪部分内容是正文呢?它又是如何清除那些杂乱的文本,最后将正文返回的呢?在5.2 节中,我们通过阅读论文《基于文本及符号密度的网页正文提取方法》了解将数学和HTML 特性结合到一起的威力——准确率高达 99%以上的网页正文提取方法。《基于文本及符号密度的网页正文提取方法》已经有了具体的代码实现,5.3 节中我们剖析了eneralNewsExtractor 库的源码,以深入了解《基于文本及符号密度的网页正文提取方法》具体的工程实现,从而掌握这套算法。

第6 章介绍了Python 项目打包部署与定时调度的相关知识。首先我们从“如何判断项目是否需要部署”开始学习,然后学习爬虫业内著名的爬虫部署平台Scrapyd 的基本使用,接着剖析Scrapyd 源码,以了解Python 项目打包和解包运行的工程实现。

爬虫本身的业务特性使得爬虫项目需要用到定时调度,我们在6.5 节中学习操作系统级定时调度和编程语言级定时调度的具体实现,同时学习Python 领域备受工程师青睐的定时任务库APScheduler 的结构和基本使用。掌握了前面讲解的知识后,你一定迫不及待地想要自己编写一款Python 领域通用的项目部署与调度平台,在6.6 节中,我们将学习如何设计和编码实现一款这样的平台,平台功能包括权限控制、项目打包与部署、定时调度、异常监控和钉钉机器人通知等。6.7 节中解析了分布式调度平台Crawlab 的核心架构,学习到分布式架构中节点通信、文件同步、任务调度和节点健康监控等知识。相信你在掌握这些知识后,技术能力和工资都将更上一层楼。

阅读建议

这是一本围绕着爬虫具体业务展开的书,书中提到了中高级爬虫工程师在实际工作当中常常遇到的问题和代码实践。这些知识并不具有强连贯性和依赖性,在阅读时可根据自己的需求直接阅读对应的章节,无须按章节顺序逐一阅读。动手实践很重要,千万不要依赖书本提供的代码,如果你在学习过程中能够自己动手写代码,相信你的进步一定会很快。

致谢

本书的顺利编写,得益于家人和朋友的帮助。首先感谢我的家人,我的爸爸妈妈、岳父岳母、夫人、妹妹和我的女儿。有了他们的支持,我才能用心写作。

特别感谢崔庆才(静觅)在我学习路上和写作期间给予的帮助。

感谢开源项目Crawlab 作者张冶青(Marvin)为本书提供的技术支持。

感谢夜幕团队队友们对我的帮助,他们是我迷茫时的明灯、三岔路口的指示牌。

感谢匡水平在本书写作期间提供的帮助。

感谢开源项目GeneralNewsExtractor 作者谢乾坤(Kingname)为本书提供的技术支持。

感谢在我学习过程中与我探讨技术的各位朋友,QQ 群群友和微信群群友,他们对技术的研究和原理探究的精神带动着我,使我学到不少知识。

感谢掘金社区为本书提供的支持。

感谢林瑞和编辑,他在书稿立项和写作过程中给我提供了很多建议和帮助。

感谢在我学习之路和写作过程中提供帮助的每一个人。


免责声明

书中所有内容仅供技术学习与研究,本书提倡读者遵守国家法律法规,切勿将本书讲解的爬虫技术用于非法用途。

相关资源

书中用到的代码片段存放在GitHub 仓库,具体网址请在电子工业出版社博文视点官网的本书页面(http://www.broadview.com.cn/39406)下载,代码仓库与本书章节的对应关系可查阅仓库中的README.md 文件。

我是一名爬虫工程师,同时也是Python 开发者和Golang 开发者。我会在微信公众号和技术博客中更新相关的技术文章,欢迎读者访问交流。当然,大家也可以添加我的微信,期待和你共同进步,一起变强!

韦世东

2020 年3 月


目录

第1 章 爬虫程序的构成和完整链条 . 1

1.1 一个简单的爬虫程序 . 1

1.2 爬虫的完整链条 . 3

1.3 爬取下来的数据被用在什么地方 . 7

1.4 爬虫工程师常用的库 . 11

1.4.1 网络请求库 . 11

1.4.2 网页文本解析. 19

1.5 数据存储 . 30

1.5.1 将数据存入MySQL 数据库 . 31

1.5.2 将数据存入MongoDB 数据库 . 34

1.5.3 将数据存入Redis 数据库 . 36

1.5.4 Excel 文件的读写 . 38

1.6 小试牛刀——出版社新闻资讯爬虫 . 42

实践题 . 46

本章小结 . 47

第2 章 自动化工具的使用 . 48

2.1 网页渲染工具 . 48

2.1.1 WebDriver 是什么 . 51

2.1.2 Selenium 的介绍和基本使用 . 52

2.1.3 Pyppeteer 的介绍和基本使用 . 59

2.1.4 Splash 知识扩展 . 61

本节小结 . 62

2.2 App 自动化工具 . 62

2.2.1 Android 调试桥 . 62

2.2.2 Airtest Project 与Poco . 64

VIII Python3 网络爬虫宝典

2.2.3 爬取App 中的图片 . 75

2.2.4 控制多台设备. 78

本节小结 . 79

实践题 . 79

本章小结 . 79

第3 章 增量爬取的原理与实现 . 80

3.1 增量爬取的分类和实现原理 . 81

3.1.1 增量爬取的分类 . 81

3.1.2 增量爬取的实现原理 . 83

本节小结 . 88

3.2 增量池的复杂度和效率 . 88

3.2.1 增量池的时间复杂度 . 88

3.2.2 增量池的空间复杂度 . 95

本节小结 . 103

3.3 Redis 的数据持久化 . 103

3.3.1 持久化方式的分类和特点 . 103

3.3.2 RDB 持久化的实践 . 106

3.3.3 AOF 持久化的实践 . 112

3.3.4 Redis 密码持久化 . 115

本节小结 . 115

实践题 . 115

本章小结 . 116

第4 章 分布式爬虫的设计与实现 . 117

4.1 分布式爬虫的原理和分类 . 117

4.1.1 分布式爬虫的原理 . 117

4.1.2 分布式爬虫的分类 . 120

4.1.3 共享队列的选择 . 122

本节小结 . 125

4.2 分布式爬虫库Scrapy-Redis . 126

4.2.1 Scrapy-Redis 的介绍和基本使用 . 127

4.2.2 去重器、调度器和队列的源码解析 . 129

目录 IX

本节小结 . 134

4.3 基于Redis 的分布式爬虫 . 134

4.3.1 对等分布式爬虫的实现 . 135

4.3.2 主从分布式爬虫的实现 . 139

本节小结 . 141

4.4 基于RabbitMQ 的分布式爬虫 . 141

4.4.1 RabbitMQ 的安装和基本操作 . 142

4.4.2 分布式爬虫的具体实现 . 146

本节小结 . 152

实践题 . 152

本章小结 . 152

第5 章 网页正文自动化提取方法 . 153

5.1 Python Readability . 155

5.2 基于文本及符号密度的网页正文提取方法 . 158

5.3 GeneralNewsExtractor . 162

5.3.1 GeneralNewsExtractor 的安装和使用 . 162

5.3.2 GeneralNewsExtractor 的源码解读 . 165

本节小结 . 175

本章小结 . 175

第6 章 Python 项目打包部署与定时调度 . 176

6.1 如何判断项目是否需要部署 . 176

6.2 爬虫部署平台Scrapyd . 179

6.2.1 Scrapyd 的安装和服务启动 . 179

6.2.2 爬虫项目的打包和部署 . 180

本节小结 . 184

6.3 Scrapyd 源码深度剖析 . 185

6.4 项目打包与解包运行实战 . 197

6.4.1 用Setuptools 打包项目 . 197

6.4.2 运行EGG 包中的Python 项目 . 199

6.4.3 编码实现Python 项目打包 . 201

本节小结 . 203

X Python3 网络爬虫宝典

6.5 定时功能 . 203

6.5.1 操作系统提供的定时功能 . 203

6.5.2 编程语言实现的定时功能 . 206

6.5.3 APScheduler . 209

本节小结 . 212

6.6 实战:开发Python 项目管理平台Sailboat . 212

6.6.1 Sailboat 的模块规划和技术选型 . 212

6.6.2 Sailboat 的权限设计思路 . 214

6.6.3 Sailboat 的数据结构设计 . 215

6.6.4 Sailboat 基础结构的搭建 . 218

6.6.5 Sailboat 用户注册和登录接口的编写 . 220

6.6.6 Sailboat 权限验证装饰器的编写 . 229

6.6.7 Sailboat 项目部署接口和文件操作对象的编写 . 232

6.6.8 Sailboat 项目调度接口的编写 . 240

6.6.9 Sailboat 执行器的编写和日志的生成 . 243

6.6.10 Sailboat 定时调度功能的实现 . 248

6.6.11 Sailboat 异常监控和钉钉机器人通知功能的编写 . 249

本节小结 . 258

6.7 分布式调度平台Crawlab 核心架构解析 . 259

实践题 . 262

本章小结 . 262


短评

好好学习才行,一定会有收获的,希望里面干货满满的,加油???!(?•??•?)??

2020-09-22 07:30:01

产品特色