前言
您好,我是崔庆才。
首先,非常高兴我们能够因此书初次或再次相会。为什么会提到再次相会呢?因为这本书已经是第 2 版了。如果您曾经阅读过第1版,那么请充许我再次对您的支持表示诚挚的感谢。
我从 2015 年开始接触网络爬虫,当时爬虫还没有这么火,我觉得能够把想要的数据抓取下来是一件非常有成就感的事情,而且可以顺便熟悉 Python,一举两得。在学习期间,我将学到的内容做好总结,并发表到我的博客上。随着发表的内容越来越多,博客的浏览量也越来越高,很多读者对我的博文给予了肯定的评价,这也给我的爬虫学习之路增添了很多动力。后来有一天,图灵的王编辑联系了我,问我有没有意向写一本爬虫方面的书,我听到之后充满了欣喜和期待,这样既能把自已学过的知识点做一个系统整理,又能跟广大的爬虫爱好者分享自己的学习经验,还能出版自己的作品,于是我很快就答应了约稿。一开始我觉得写书并不是一件那么难的事,后来真正写了才发现其中包含的艰辛。书相比博客,用词更严谨,而且逻辑需要更密,很多细节必须考虑得非常周全。编写前前后后花了近一年的时间,审稿和修改又用了将近半年的时间,一路走来甚是不易,不过最后看到书稿成型,我觉得这一切都是值得的。
本书第 1 版是在 2018 年出版的,出版后受到了不少读者的支持和喜爱,真的非常感谢各位读者的支持。有的读者还特地告诉我,他看了我的书之后找到了一份不错的爬虫工作,听到之后我真的非常开心,因为我的一些知识和经验帮助到了他人。
之所以写第 2 版,一方面是技术总是在不断地发展和进步,爬虫技术也一样,它在爬虫和反爬虫不断斗争的过程中持续演进着。现在的网页采取了各种防护措施,比如前端代码的压缩和混淆、API 的参数加密、WebDriver 的检测,因此要做到高效的数据爬取,需要我们懂一些 JavaScript 逆向分析技术。与此同时,App 的抓包防护、加壳保护、本地化、风控检测使得越来越多的 App 数据难以爬取,所以我们不得不了解一些 App 逆向相关的技术,比如 Xposed、Frida、IDAPro 等工具的使用。近几年,深度学习和人工智能发展得也是如火如茶,所以爬虫还可以和人工智能相结合,比如基于深度学习的验证码识别、网页内容的智能解析和提取等技术。另外,一些大规模爬虫的管理和运维技术也在不断发展,当前 Kubernetes、Docker、Prometheus 等云原生技术也非常火爆,基于 Kubernetes 等云原生技术的爬虫管理和运维解决方案也已经很受青。然而,第 1 版几乎没有提及以上这些新兴技术。
另一方面,第 1 版引用了很多案例网站和服务,比如猫眼电影网站、淘宝网站、代理服务网站,几年过去,其中有些案例网站和服务早已经改版或者停止维护,这就导致第 1 版中的很多代码已经不能正常运行了。这其实是一个很大的问题,因为代码运行不通会大大打击读者学习的积极性和降低他们的成就感,而且还浪费不少时间。另外,即使爬虫代码及时更新了,我们也不知道这些案例网站和服务什么时候会再次改版,这都是不可控的。为了彻底解决这个问题,我花了近半年的时间构建了一个爬虫案例平台( https://scrape.center )一一包含几十个案例网站,包括服务端染(SSR)网站、单页面应用(SPA)网站、各类反爬网站、验证码网站、模拟登录网站、各类 App 等,覆盖了现在爬虫和反爬虫相关的大多数技术。整个平台都由我来维护,书中儿乎所有的案例网站都来自这个平台,这样就解决了页面改版或停止维护的问题。
相比第 1 版,本书第 2 版主要更新了如下内容。
-
绝大多数案例网站来自自建的案例平台,以后再也不用担心案例网站过期或改版的问题
-
删除了第 1 版中的第 1 章 “环境安装”,将配置环境的内容全部汇总并迁移到案例平台( https://setup.scrape.center ),然后在书中以外链的形式附上,以确保环境配置和安装说明相关的内容能得到及时更新。
-
增加了一些新的请求库、解析库、存储库等,如 httpx、parsel、Elasticsearch 等。
-
增加了异步爬虫,如协程的基本原理、aiohttp 的使用和爬取实战。
-
增加了一些新兴自动化工具,如 Pyppeteer、Playwright。
-
增加了深度学习相关的内容,如图形验证码、滑动验证码的识别方案。
-
丰富了模拟登录的内容,如增加了 JWT 模拟登录的介绍和实战、大规模账号池的优化。
-
增加了 JavaScript 逆向,包括网站加密和混淆技术、JavaScript 逆向调试技巧、JavaScript 的各种模拟执行方式、AST 还原混淆代码、WebAssembly 等相关技术。
-
丰富了 App 自动化爬取技术,如介绍了新兴框架 Airtest、手机群控和云手机技术。
-
增加了 Android 逆向,如反编译、反汇编、Hook、脱壳、分析和模拟执行 so 文件等技术。
-
增加了页面智能解析,包括提取列表页、详情页内容的算法和分类算法。
-
丰富了 Scrapy 相关章节的内容,如 Pyppeteer 的对接、RabbitMQ 的对接、Prometheus 的对接等。
-
增加了基于 Kubernetes、Docker、Prometheus、Grafana 等云原生技术的爬虫管理和运维解决方案。
由于工作、生活等各方面的原因,我的时间并不像写第 1 版时那么宽裕,所以第 2 版的编写进度比较慢,利用的几乎都是下班和周末的时间,耗时将近两年。如今,第 2 版终于跟读者见面了!在编写期间我也收到过很多读者的询问和鼓励,非常感谢各位读者的支持和耐心等待。
希望本书能够为您学习爬虫提供帮助。
本书内容
本书内容一共分为 17 章,归纳如下。
-
第 1 章介绍了学习爬虫之前需要了解的基础知识,如 HTTP、爬虫、代理、网页结构、多进程、多线程等内容。对爬虫没有任何了解的读者,我建议好好了解这一章的知识。
-
第 2 章 介绍了最基本的爬虫操作,爬虫通常是从这一步学起的。这一章介绍了最基本的请求库(urllib、request、httpx)和正则表达式的基本用法。学完这一章,就可以掌握最基本的爬虫技术了。
-
第 3 章 介绍了网页解析库的基本用法,包括 Beautiful Soup、XPath、pyquery、parsel的基本使用方法,这些库可以使信息的提取更加方便、快捷,是爬虫必备的利器。
-
第 4 章 介绍了数据存储的常见形式及存储操作,包括 TXT 文件、JSON 文件、CSV 文的存储,以及关系数据库 MySQL 和 非关系数据库 MongoDB、Redis 的基本存储操作,另外还介绍了 ElasticSearch 搜索引擎存储、RabbitMQ 消息队列的用法。学完这一章,就可以灵活、方便地保存爬取下来的数据。
-
第 5 章 介绍了 Ajax 数据爬取的过程。一些网页数据可能是通过 Ajax 请求 API 接口的方式加载的,用常规方式无法爬取,这一章介绍了 Ajax 分析和爬取实战案例。
-
第 6 章 介绍了异步爬虫的相关知识,如支持更高并发的协程的基本原理、aiohttp库的使用和实战案例。有了异步爬虫,爬虫的爬取效率将会大大提高。
-
第 7 章 介绍了爬取动态渲染页面的相关内容。现在越来越多的网站内容是由 JavaScript 渲染得到的,原始 HTML 文本可能不包含任何有效内容,同时渲染过程会涉及某些 JavaScript 加密算法,对此可以使用 Selenium、Splash、Pyppeteer、Playwright 等工具模拟浏览器来进行数据爬取。
-
第 8 章 介绍了验证码的相关处理方法。验证码是网站反爬虫的重要措施,我们可以通过这一章了解各类验证码的应对方案,包括图形验证码、滑动验证码、点选验证码、手机验证码,其中会涉及 OCR、OpenCV、深度学习、打码平台的相关知识。
-
第 9 章 介绍了代理的使用方法。限制IP的访问也是网站反爬虫的重要措施,使用代理可以有效解决这个问题,我们可以使用代理来伪装爬虫的真实 IP。通过这一章,我们能学习代理的使用方法,代理池的维护方法,以及ADSL拨号代理的使用方法。
-
第 10 章 介绍了模拟登录爬取的方法。某些网站需要登录才可以看到需要的内容,这时就需要用爬虫模拟登录网站再进行爬取了。这一章介绍了最基本的模拟登录方法,包括基于 Session + Cookie 的模拟登录和基于 JWT 的模拟登录。
-
第 11 章 介绍了 JavaScript 逆向的相关知识,包括网站的混淆技术、JavaScript 逆向常用的调试和 Hook 技术、JavaScript 模拟执行的各个方案,接着介绍了 AST 技术来还原 JavaScript 混淆代码,另外也对 WebAssembly 技术进行了基本介绍。
-
第 12 章 介绍了 App 的爬取方法,包括基本的抓包软件(Charles、mitmproxy)如何使用,然后介绍了利用 mitmdump 对接 Python 脚本的方法进行实时抓取,以及使用 Appium、Airtest 模拟手机 App 的操作进行数据爬取。
-
第 13 章 介绍了 Android 逆向的相关知识,包括反编译工具 jadx、EJB 和常用的 Hook 框架 Xposed、Frida 等工具的使用方法,另外还介绍了 SSL Pining、脱壳、反汇编、so文件模拟执行等技术。
-
第 14 章 介绍了页面智能解析相关的技术,比如新闻详情页面中标题、正文、作者等信息以及新闻列表页面中标题、链接等信息的智能提取、另外还介绍了如何智能分辨详情页和列表页。有了页面智能解析技术,在提取很多内容时就可以免去写规则的困扰。
-
第 15 章 介绍了 Scrapy 爬虫框架及用法。Scrapy 是目前使用最广泛的爬虫框架,这章介绍了它的基本架构、原理及各个组件的使用方法,另外还介绍了 Scrapy 对接 Selenium、Pyppeteer等的方法。
-
第 16 章 介绍了分布式爬虫的基本原理及实现方法。为了提高爬取效率,分布式爬虫是必不可少的,这章介绍了使用 Scrapy-Redis、RabbitMQ实现分布式爬虫的方法。
-
第 17 章 介绍了分布式爬虫的部署及管理方法。方便、快速地完成爬虫的分布式部署,可以节省开发者大量的时间。这一章介绍了两种管理方案,一种是基于 Scrapy、Scrapyd、Gerapy的方案,另一种是基于 Kubernetes、Docker、Prometheus、Grafana 的方案。