使用Python编写网络爬虫程序获取互联网上的大数据是当前的热门专题。本书内容包括三部分:基础部分、进阶部分和项目实践。基础部分(第1~7章)主要介绍爬虫的三个步骤——获取网页、解析网页和存储数据,并通过诸多示例的讲解,让读者能够从基础内容开始系统性地学习爬虫技术,并在实践中提升Python爬虫水平。进阶部分(第8~13章)包括多线程的并发和并行爬虫、分布式爬虫、更换IP等,帮助读者进一步提升爬虫水平。项目实践部分(第14~17章)使用本书介绍的爬虫技术对几个真实的网站进行抓取,让读者能在读完本书后根据自己的需求写出爬虫程序。
近年来,大数据成为业界与学术界的热门话题之一,数据已经成为每个公司极为重要的资产。互联网上大量的公开数据为个人和公司提供了以往想象不到的可以获取的数据量,而掌握网络爬虫技术可以帮助你获取这些有用的公开数据集。
执笔本书的起因是我打算在知乎上写博客向香港中文大学市场营销学的研究生讲解Python 网络爬虫技术,让这些商科学生掌握一些大数据时代重要的技术。因此,本书除了面向技术人员外,还面向不懂编程的“小白”,希望能够将网络爬虫学习的门槛降低,让大家都能享受到使用网络爬虫编程的乐趣。过去的一年中,本书第1版帮助很多读者开启了Python和网络爬虫的世界,因此有幸获得出版社的邀请,在之前版本的基础上进行修改,更新书中的案例以及添加新的内容,形成第2版。
本书所有代码均在 Python 3.6 中测试通过,并存放在 Github 和百度网盘上:Github链接为 https://github.com/Santostang/PythonScraping;百度网盘链接为https://pan.baidu.com/s/14RA8Srew8tbqVT977JDvNw,提取码为h2kf。为了方便大家练习Python网络爬虫,我专门搭建了一个博客网站用于Python网络爬虫的教学,本书的教学部分全部基于爬取我的个人博客网(www.santostang.com)。一方面,由于这个网站不会更改设计和框架,因此本书的网络爬虫代码可以一直使用;另一方面,由于这是我自己的博客网站,因此可以避免一些法律上的风险。
读者对象
(1)对Python编程和网络爬虫感兴趣的大专院校师生,需要获取数据进行分析;
(2)打算转行或入行爬虫工程师、数据分析师、数据科学家的人士;
(3)需要使用网络爬虫技术自动获取数据分析的各行业人士。
勘误和支持
由于作者水平和能力有限,编写时间仓促,不妥之处在所难免,希望读者批评指正。本书的读者QQ群为798652826,欢迎读者加群交流。另外,也可以到我的博客www.santostang.com反馈意见,欢迎读者和网络爬虫爱好者不吝赐教。
如何阅读本书
本书分为17章。
第 1~7 章为基础部分,主要介绍Python入门,Python网络爬虫的获取网页、解析网页和存储数据三个流程,以及Scrapy爬虫框架。这部分每一章的最后都有自我实践题,读者可以通过实践题熟悉Python 爬虫代码的编写。
第 8~13 章为进阶部分,主要介绍多线程和多进程爬虫、反爬虫、服务器爬虫和分布式爬虫等进阶爬虫技术,这部分为你在爬虫实践中遇到的问题提供了解决方案。
第 14~17章为项目实践部分,每一章包含一个详细的爬虫案例,每个案例都覆盖之前章节的知识,让你在学习 Python 爬虫后,可以通过在真实网站中练习来消化和吸收 Python爬虫的知识。
本书几乎每章都使用案例来学习Python网络爬虫,希望告诉读者“通过实战解决实际问题,才能高效地学习新知识”。手输代码,练习案例,才是学习Python和网络爬虫的有效方法。
致谢
首先感谢卞诚君老师在我写书过程中给予的指导和帮助。没有他的提议,我不会想到将自己的网络爬虫博客整理成一本书出版,更不会有本书的第2版。
从转行数据分析,到申请去康奈尔大学读书,再到回国做数据分析师,我在计算机技术和数据科学的道路上,得到了无数贵人的帮助和提携。首先感谢刘建南教授带我进入了数据挖掘的大门,无私地将数据挖掘、营销知识和经验倾囊相授,您是我的启蒙老师,也是我一生的恩师。
感谢腾讯公司商业分析组和数据服务中心的各位同事,特别感谢我的组长张殿鹏和导师王欢,他们耐心地培养和教导我如何成为一名优秀的数据分析师,让我放手去挑战和尝试不同项目,坚持将数据分析的成果落地。
感谢一路走来,支持我、帮助我的前辈和朋友,包括香港中文大学的教授和朋友——马旭飞教授、李宜威博士、数据科学家周启航、数据分析师赵作栋、数据分析师王礼斌以及好友孙成帅、张蓓等,康奈尔大学的同学——数据科学家汤心韵等、思路富邦有限公司总裁陈智铨、数据科学家吴嘉杰。尤其感谢IBM香港CTO戴剑寒博士、香港中文大学(深圳)校长讲席教授贾建民博士、TalkingData腾云大学执行校长杨慧博士和DaoCloud首席架构师王天青在百忙中热情地为本书写推荐语。
感谢我的父母、妹妹和女朋友给我一贯的支持和帮助!
唐松
中国深圳
唐松,康奈尔大学信息科学研究生,高考获全额奖学金就读于香港中文大学计量营销和金融学,毕业后与IBM合作A100项目,为美的、中信等公司实践大数据落地项目,热衷将数据科学与商业结合应用。
前言
第1章 网络爬虫入门1
1.1 为什么要学网络爬虫2
1.1.1 网络爬虫能带来什么好处2
1.1.2 能从网络上爬取什么数据3
1.1.3 应不应该学爬虫3
1.2 网络爬虫是否合法3
1.2.1 Robots协议4
1.2.2 网络爬虫的约束5
1.3 网络爬虫的基本议题6
1.3.1 Python爬虫的流程7
1.3.2 三个流程的技术实现7
第2章 编写第一个网络爬虫9
2.1 搭建Python平台10
2.1.1 Python的安装10
2.1.2 使用pip安装第三方库12
2.1.3 使用编辑器Jupyter 编程13
2.1.4 使用编辑器Pycharm编程15
2.2 Python 使用入门18
2.2.1 基本命令18
2.2.2 数据类型19
2.2.3 条件语句和循环语句21
2.2.4 函数23
2.2.5 面向对象编程24
2.2.6 错误处理28
2.3 编写第一个简单的爬虫29
2.3.1 第一步:获取页面29
2.3.2 第二步:提取需要的数据30
2.3.3 第三步:存储数据32
2.4 Python实践:基础巩固33
2.4.1 Python基础试题34
2.4.2 参考答案35
2.4.3 自我实践题38
第3章 静态网页抓取39
3.1 安装Requests40
3.2 获取响应内容40
3.3 定制Requests41
3.3.1 传递URL参数41
3.3.2 定制请求头42
3.3.3 发送POST请求43
3.3.4 超时44
3.4 Requests爬虫实践:TOP250电影数据44
3.4.1 网站分析45
3.4.2 项目实践45
3.4.3 自我实践题47
第4章 动态网页抓取48
4.1 动态抓取的实例49
4.2 解析真实地址抓取50
4.3 通过Selenium模拟浏览器抓取55
4.3.1 Selenium的安装与基本介绍55
4.3.2 Selenium的实践案例57
4.3.3 Selenium获取文章的所有评论58
4.3.4 Selenium的高级操作61
4.4 Selenium爬虫实践:深圳短租数据64
4.4.1 网站分析64
4.4.2 项目实践66
4.4.3 自我实践题69
第5章 解析网页70
5.1 使用正则表达式解析网页71
5.1.1 re.match方法71
5.1.2 re.search方法74
5.1.3 re.findall方法74
5.2 使用BeautifulSoup解析网页76
5.2.1 BeautifulSoup的安装76
5.2.2 使用BeautifulSoup获取博客标题77
5.2.3 BeautifulSoup的其他功能78
5.3 使用lxml解析网页82
5.3.1 lxml的安装82
5.3.2 使用lxml获取博客标题82
5.3.3 XPath的选取方法84
5.4 总结85
5.5 BeautifulSoup爬虫实践:房屋价格数据86
5.5.1 网站分析86
5.5.2 项目实践87
5.5.3 自我实践题89
第6章 数据存储90
6.1 基本存储:存储至TXT或CSV91
6.1.1 把数据存储至TXT91
6.1.2 把数据存储至CSV93
6.2 存储至MySQL数据库94
6.2.1 下载安装MySQL95
6.2.2 MySQL的基本操作99
6.2.3 Python操作MySQL数据库104
6.3 存储至MongoDB数据库106
6.3.1 下载安装MongoDB107
6.3.2 MongoDB的基本概念110
6.3.3 Python操作MongoDB数据库112
6.3.4 RoboMongo的安装与使用113
6.4 总结115
6.5 MongoDB爬虫实践:虎扑论坛116
6.5.1 网站分析116
6.5.2 项目实践117
6.5.3 自我实践题123
第7章 Scrapy框架124
7.1 Scrapy是什么125
7.1.1 Scrapy架构125
7.1.2 Scrapy数据流(Data Flow)126
7.1.3 选择Scrapy还是Requests+bs4127
7.2 安装Scrapy128
7.3 通过Scrapy抓取博客128
7.3.1 创建一个Scrapy项目128
7.3.2 获取博客网页并保存129
7.3.3 提取博客标题和链接数据131
7.3.4 存储博客标题和链接数据133
7.3.5 获取文章内容134
7.3.6 Scrapy的设置文件136
7.4 Scrapy爬虫实践:财经新闻数据137
7.4.1 网站分析137
7.4.2 项目实践138
7.4.3 自我实践题141
第8章 提升爬虫的速度142
8.1 并发和并行,同步和异步143
8.1.1 并发和并行143
8.1.2 同步和异步143
8.2 多线程爬虫144
8.2.1 简单的单线程爬虫145
8.2.2 学习Python多线程145
8.2.3 简单的多线程爬虫148
8.2.4 使用Queue的多线程爬虫150
8.3 多进程爬虫153
8.3.1 使用multiprocessing的多进程爬虫153
8.3.2 使用Pool + Queue的多进程爬虫155
8.4 多协程爬虫158
8.5 总结160
第9章 反爬虫问题163
9.1 为什么会被反爬虫164
9.2 反爬虫的方式有哪些164
9.2.1 不返回网页165
9.2.2 返回非目标网页165
9.2.3 获取数据变难166
9.3 如何“反反爬虫”167
9.3.1 修改请求头167
9.3.2 修改爬虫的间隔时间168
9.3.3 使用代理171
9.3.4 更换IP地址172
9.3.5 登录获取数据172
9.4 总结172
第10章 解决中文乱码173
10.1 什么是字符编码174
10.2 Python的字符编码176
10.3 解决中文编码问题179
10.3.1 问题1:获取网站的中文显示乱码179
10.3.2 问题2:非法字符抛出异常180
10.3.3 问题3:网页使用gzip压缩181
10.3.4 问题4:读写文件的中文乱码182
10.4 总结184
第11章 登录与验证码处理185
11.1 处理登录表单186
11.1.1 处理登录表单186
11.1.2 处理cookies,让网页记住你的登录190
11.1.3 完整的登录代码193
11.2 验证码的处理194
11.2.1 如何使用验证码验证195
11.2.2 人工方法处理验证码197
11.2.3 OCR处理验证码200
11.3 总结203
第12章 服务器采集204
12