产品特色
编辑推荐
Scrapy是一个开源的Python爬虫框架,可以用来轻松提取从页面数据。Scrapy带有丰富的特性,可通过简单的编码或配置来访问,从而可以节省开发人员数周的开发时间,并高效地提取所需数据。Scrapy有一个高度活跃且迅速增长的社区,而且已经成为黑客、创业者和Web爬取专家的首*框架。
本书讲解了Scrapy的基础知识,讨论了如何从任意源提取数据,如何清理数据,以及如何使用Python和第三方API进行处理,以满足自身需求。本书还讲解了如何将爬取的数据高效地馈入数据库、搜索引擎和流数据处理系统(比如Apache Spark)。在学习完本书后,你将对数据爬取胸有成竹,并将数据应用在自己的应用程序中。
本书内容:
使用HTML和Xpath提取所需的数据;
使用Python编写Scrapy爬虫,并在网络上进行爬取操作;
将数据推送到任意数据库、搜搜引擎或分析系统的方法;
配置爬虫,使其下载文件和图形,以及使用代理;
创建用来限流数据的高效管道;
使用Twitsted实践驱动的API并发处理数百个Item;
让爬虫更快速,让内存使用率更高,以及对Scrapy性能进行调优的技巧;
使用Scrapyd和Scrapinghub执行大规模分布式爬取操作的方法。
内容简介
Scrapy是使用Python开发的一个快速、高层次的屏幕抓取和Web抓取框架,用于抓Web站点并从页面中提取结构化的数据。《精通Python爬虫框架Scrapy》以Scrapy 1.0版本为基础,讲解了Scrapy的基础知识,以及如何使用Python和三方API提取、整理数据,以满足自己的需求。
本书共11章,其内容涵盖了Scrapy基础知识,理解HTML和XPath,安装Scrapy并爬取一个网站,使用爬虫填充数据库并输出到移动应用中,爬虫的强大功能,将爬虫部署到Scrapinghub云服务器,Scrapy的配置与管理,Scrapy编程,管道秘诀,理解Scrapy性能,使用Scrapyd与实时分析进行分布式爬取。本书附录还提供了各种软件的安装与故障排除等内容。
本书适合软件开发人员、数据科学家,以及对自然语言处理和机器学习感兴趣的人阅读。
作者简介
Dimitrios Kouzis-Loukas作为一位软件开发人员,已经拥有超过15年的经验。同时,他还使用自己掌握的知识和技能,向广大读者讲授如何编写软件。
他学习并掌握了多门学科,包括数学、物理学以及微电子学。他对这些学科的透彻理解,提高了自身的标准,而不只是“实用的解决方案”。他知道真正的解决方案应当是像物理学规律一样确定,像ECC内存一样健壮,像数学一样通用。
Dimitrios目前正在使用新的数据中心技术开发低延迟、高可用的分布式系统。他是语言无关论者,不过对Python、C++和Java略有偏好。他对开源软硬件有着坚定的信念,他希望他的贡献能够造福于各个社区和全人类。
关于译者
李斌,毕业于北京科技大学计算机科学与技术专业,获得硕士学位。曾任职于阿里巴巴,当前供职于凡普金科,负责应用安全工作。热爱Python编程和Web安全,希望以更加智能和自动化的方式提升网络安全。
目录
第 1章 Scrapy简介 1
1.1 初识Scrapy 1
1.2 喜欢Scrapy的更多理由 2
1.3 关于本书:目标和用途 3
1.4 掌握自动化数据爬取的重要性 4
1.4.1 开发健壮且高质量的应用,并提供合理规划 4
1.4.2 快速开发高质量可行产品 5
1.4.3 Google不会使用表单,爬取才能扩大规模 6
1.4.4 发现并融入你的生态系统 7
1.5 在充满爬虫的世界里做一个好公民 7
1.6 Scrapy不是什么 8
1.7 本章小结 9
第 2章 理解HTML和XPath 10
2.1 HTML、DOM树表示以及XPath 10
2.1.1 URL 11
2.1.2 HTML文档 11
2.1.3 树表示法 13
2.1.4 你会在屏幕上看到什么 14
2.2 使用XPath选择HTML元素 15
2.2.1 有用的XPath表达式 16
2.2.2 使用Chrome获取XPath表达式 19
2.2.3 常见任务示例 20
2.2.4 预见变化 21
2.3 本章小结 22
第3章 爬虫基础 23
3.1 安装Scrapy 24
3.1.1 MacOS 24
3.1.2 Windows 25
3.1.3 Linux 25
3.1.4 新源码安装 26
3.1.5 升级Scrapy 26
3.1.6 Vagrant:本书中运行示例的官方方式 27
3.2 UR2IM——基本抓取流程 28
3.2.1 URL 29
3.2.2 请求和响应 31
3.2.3 Item 31
3.3 一个Scrapy项目 37
3.3.1 声明item 38
3.3.2 编写爬虫 40
3.3.3 填充item 43
3.3.4 保存文件 45
3.3.5 清理——item装载器与管理字段 47
3.3.6 创建contract 50
3.4 抽取更多的URL 53
3.4.1 使用爬虫实现双向爬取 56
3.4.2 使用CrawlSpider实现双向爬取 59
3.5 本章小结 61
第4章 从Scrapy到移动应用 62
4.1 选择手机应用框架 62
4.2 创建数据库和集合 63
4.3 使用Scrapy填充数据库 65
4.4 创建手机应用 68
4.4.1 创建数据库访问服务 69
4.4.2 创建用户界面 69
4.4.3 将数据映射到用户界面 70
4.4.4 数据库字段与用户界面控件间映射 71
4.4.5 测试、分享及导出你的手机应用 72
4.5 本章小结 73
第5章 迅速的爬虫技巧 75
5.1 需要登录的爬虫 75
5.2 使用JSON API和AJAX页面的爬虫 81
5.3 30倍速的房产爬虫 85
5.4 基于Excel文件爬取的爬虫 90
5.5 本章小结 93
第6章 部署到Scrapinghub 94
6.1 注册、登录及创建项目 94
6.2 部署爬虫与计划运行 96
6.3 访问item 99
6.4 计划定时爬取 100
6.5 本章小结 101
第7章 配置与管理 102
7.1 使用Scrapy设置 102
7.2 基本设置 103
7.2.1 分析 104
7.2.2 性能 107
7.2.3 提前终止爬取 108
7.2.4 HTTP缓存和离线运行 108
7.2.5 爬取风格 109
7.2.6 feed 110
7.2.7 媒体下载 111
7.2.8 Amazon Web服务 113
7.2.9 使用代理和爬虫 113
7.3 进阶设置 114
7.3.1 项目相关设置 115
7.3.2 Scrapy扩展设置 116
7.3.3 下载调优 116
7.3.4 自动限速扩展设置 117
7.3.5 内存使用扩展设置 117
7.3.6 日志和调试 117
7.4 本章小结 118
第8章 Scrapy编程 119
8.1 Scrapy是一个Twisted应用 119
8.1.1 延迟和延迟链 122
8.1.2 理解Twisted和非阻塞I/O——一个Python故事 125
8.2 Scrapy架构概述 132
8.3 示例1:非常简单的管道 135
8.4 信号 136
8.5 示例2:测量吞吐量和延时的扩展 138
8.6 中间件延伸 141
8.7 本章小结 144
第9章 管道秘诀 145
9.1 使用REST API 146
9.1.1 使用treq 146
9.1.2 用于写入Elasticsearch的管道 146
9.1.3 使用Google Geocoding API实现地理编码的管道 149
9.1.4 在Elasticsearch中启用地理编码索引 156
9.2 与标准Python客户端建立数据库接口 157
9.3 使用Twisted专用客户端建立服务接口 161
9.4 为CPU密集型、阻塞或遗留功能建立接口 166
9.4.1 处理CPU密集型或阻塞操作的管道 166
9.4.2 使用二进制或脚本的管道 168
9.5 本章小结 172
第 10章 理解Scrapy性能 173
10.1 Scrapy引擎——一种直观方式 173
10.1.1 级联队列系统 175
10.1.2 定义瓶颈 176
10.1.3 Scrapy性能模型 176
10.2 使用telnet获得组件利用率 178
10.3 基准系统 180
10.4 标准性能模型 182
10.5 解决性能问题 185
10.5.1 案例 #1:CPU饱和 185
10.5.2 案例 #2:代码阻塞 187
10.5.3 案例 #3:下载器中的“垃圾” 188
10.5.4 案例 #4:大量响应或超长响应造成的溢出 191
10.5.5 案例 #5:有限/过度item并发造成的溢出 193
10.5.6 案例 #6:下载器未充分利用 194
10.6 故障排除流程 197
10.7 本章小结 198
第 11章 使用Scrapyd与实时分析进行分布式爬取 199
11.1 房产的标题是如何影响价格的 200
11.2 Scrapyd 200
11.3 分布式系统概述 203
11.4 爬虫和中间件的变化 205
11.4.1 索引页分片爬取 205
11.4.2 分批爬取URL 207
11.4.3 从设置中获取初始URL 211
11.4.4 在Scrapyd服务器中部署项目 213
11.5 创建自定义监控命令 215
11.6 使用Apache Spark流计算偏移量 216
11.7 运行分布式爬取 218
11.8 系统性能 220
11.9 关键要点 221
11.10 本章小结 221
附录A 软件的安装与故障排除 222
Python网络爬虫实战精粹:高效采集与数据处理 在这个信息爆炸的时代,从浩瀚的网络中精准、高效地捕获所需数据,已成为许多领域不可或缺的关键技能。本书并非一本简单的技术手册,而是带领读者踏上一段深度实践的旅程,旨在培养读者独立解决复杂网络数据采集难题的能力,并将其转化为有价值的洞察。我们将聚焦于Python这一强大且易于上手的编程语言,深入探索其在网络爬虫技术中的应用,从基础概念到高级技巧,层层递进,力求让每一位读者都能掌握构建健壮、高效、可维护的网络爬虫系统的能力。 第一部分:基础构建——为你打下坚实的爬虫基石 在开始任何一项复杂的任务之前,打牢基础至关重要。本书的第一部分将系统地梳理网络爬虫的核心概念,并为你准备好所需的工具集。 初识网络爬虫:原理与场景:我们将从最根本的地方开始,解答“什么是网络爬虫?”、“它们是如何工作的?”以及“在哪些场景下网络爬虫能发挥作用?”。通过对HTTP/HTTPS协议、HTML DOM结构、CSS选择器等基础知识的清晰讲解,让你理解数据如何在浏览器和服务器之间流动,以及我们如何通过解析这些结构来提取信息。我们将分析网络爬虫的合法性与伦理边界,强调负责任的数据采集的重要性。 Python基础回顾与爬虫优化:虽然本书假设读者具备一定的Python基础,但我们会针对爬虫开发过程中常用的Python特性进行回顾和强调。这包括但不限于:列表推导式、生成器、装饰器、上下文管理器等,以及如何利用它们来提升代码的可读性和效率。我们还将介绍Python中常用的数据结构和算法,分析它们在爬虫设计中的应用。 Python标准库与第三方库的运用:Python强大的生态系统是其在爬虫领域大放异彩的关键。我们将详细介绍Python标准库中的宝藏,如`urllib.request`用于发送HTTP请求,`re`模块用于正则表达式匹配,`json`模块用于处理JSON数据等。更重要的是,我们将聚焦于那些为网络爬虫量身打造的强大第三方库,如`requests`库,它以简洁的API和强大的功能,极大地简化了HTTP请求的发送和响应的处理。我们将深入讲解`requests`库的各种用法,包括发送GET、POST请求,处理Cookies、Session,设置请求头,以及错误处理机制。 HTML解析利器:Beautiful Soup与lxml:从网页中提取结构化数据是爬虫的核心任务。本书将投入大量篇幅讲解两款最主流的HTML解析库:`Beautiful Soup`和`lxml`。我们将详细介绍它们的安装、基本用法,以及如何利用CSS选择器和XPath表达式精确地定位和提取所需信息。我们会通过大量的实际案例,展示如何应对复杂的HTML结构,包括嵌套标签、属性提取、文本清洗等。 实战演练:爬取静态网页:理论知识需要付诸实践。本部分将引导你完成一系列由浅入深的实战项目,从爬取简单的静态网页,到获取包含多页内容的网站数据。你将学会如何分析目标网站的结构,编写爬虫脚本,处理分页逻辑,并最终将提取到的数据保存到本地文件中,例如CSV、JSON等格式。 第二部分:进阶探索——驾驭动态与复杂网络环境 现实世界的网络数据远比静态网页复杂。本部分将带你进入更具挑战性的领域,学习如何处理动态加载的内容、规避反爬机制,以及构建更 robust 的爬虫系统。 Selenium:模拟浏览器行为,征服JavaScript:许多现代网站依赖JavaScript动态加载内容,静态请求无法获取。`Selenium`库应运而生,它能够驱动浏览器进行交互,完美模拟用户操作。我们将详细讲解`Selenium`的安装和配置,如何使用它来打开网页、定位元素(包括使用WebDriver API)、执行JavaScript代码、处理弹窗、切换窗口等。通过`Selenium`,你将能够爬取那些对传统爬虫“不友好”的动态网站。 规避反爬虫策略:智能应对:网站运营者为了保护数据,会部署各种反爬虫策略,如IP限制、User-Agent检测、验证码、JavaScript挑战等。我们将深入分析常见的反爬虫技术,并提供相应的应对策略。这包括: IP代理池的构建与使用:理解IP限制的原理,学习如何构建和维护一个可用的IP代理池,包括代理IP的获取、检测和轮换,以及如何在请求中使用代理。 User-Agent的伪装与管理:讲解User-Agent的重要性,以及如何通过轮换不同的User-Agent来模拟真实用户。 Cookies与Session的管理:深入理解Cookies和Session的作用,以及如何正确地在爬虫中处理它们,以保持登录状态或绕过某些基于会话的限制。 验证码识别的初步探索:介绍验证码的类型,以及一些基本的验证码识别方法,包括手动处理和集成第三方OCR服务(请注意,此处仅作介绍,复杂的验证码识别超出本书范围)。 JavaScript挑战的处理:分析一些JavaScript动态生成或校验的机制,并探讨可能的绕过或模拟方法。 异步爬虫与并发处理:效率的飞跃:对于大规模的数据采集任务,串行执行效率低下。本部分将介绍如何利用Python的异步编程特性,大幅提升爬虫的效率。我们将深入讲解`asyncio`库,理解协程、事件循环等概念,并学习如何结合`aiohttp`等异步HTTP库,构建高效的异步爬虫。你将掌握如何利用多线程、多进程或异步IO模型,实现高并发的数据采集。 构建健壮的爬虫系统:错误处理与容错机制:一个真正实用的爬虫必须能够应对各种异常情况。我们将深入讲解如何设计 robust 的错误处理机制,包括网络错误、解析错误、数据异常等,并实现完善的重试机制、日志记录和异常报警。你将学会如何让你的爬虫在不确定的网络环境中稳定运行。 第三部分:数据处理与应用——让数据说话 捕获数据只是第一步,如何有效地处理、存储和应用这些数据,才能真正发挥其价值。本部分将聚焦于数据处理与存储的方方面面。 数据清洗与预处理:从网络抓取的数据往往是“脏”的,包含重复、缺失、格式不统一等问题。我们将介绍常用的数据清洗技术,包括数据去重、缺失值处理、数据类型转换、字符串处理、异常值检测与处理等。你将学会如何将原始数据转化为干净、可用的数据集。 数据存储方案:根据不同的需求,我们需要选择合适的数据存储方案。我们将介绍: 文件存储:CSV、JSON、XML等常见文件格式的读写操作,以及如何选择最适合的格式。 关系型数据库:使用Python连接和操作SQLite、MySQL、PostgreSQL等关系型数据库,进行数据的插入、查询、更新和删除。 NoSQL数据库:简单介绍MongoDB等NoSQL数据库的特性,以及如何通过Python驱动进行数据存储。 数据分析与可视化入门:将采集到的数据进行分析,从中挖掘有价值的信息,是网络爬虫的最终目的。我们将介绍Python中强大的数据分析库`pandas`,包括DataFrame的使用、数据筛选、聚合、分组等操作。同时,也会简要介绍数据可视化工具,如`matplotlib`和`seaborn`,让你能够将分析结果以直观的图表形式呈现。 实战案例:构建一个完整的爬虫项目:本书的最后,我们将结合前面学到的所有知识,完成一个端到端的完整爬虫项目。这个项目将涵盖从需求分析、网站分析、技术选型,到编写代码、处理反爬、数据存储,再到最终的数据分析与报告。通过这个综合性项目,你将能够系统地巩固所学知识,并获得构建大型爬虫项目的实操经验。 本书特点: 理论与实践相结合:每一章都配有详细的理论讲解和丰富的代码示例,让你边学边练。 循序渐进:从基础概念到高级技巧,难度逐步提升,适合不同阶段的学习者。 注重实战:通过大量的真实案例和项目演练,帮助你快速掌握实际开发技能。 强调效率与健壮性:不仅教你如何爬取数据,更教你如何构建高效、稳定、可维护的爬虫系统。 紧跟技术潮流:涵盖了当前网络爬虫领域最流行和最实用的技术。 通过本书的学习,你将不仅仅是一个代码的执行者,更会成为一个能够独立思考、解决问题、从海量网络数据中创造价值的网络爬虫工程师。准备好开启你的数据采集之旅了吗?