《用Python写网络爬虫(第 2版》讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中抓取数据的3种方法,提取缓存中的数据,使用多个线程和进程进行并发抓取,抓取动态页面中的内容,与表单进行交互,处理页面中的验证码问题,以及使用Scarpy和Portia进行数据抓取,并在最后介绍了使用本书讲解的数据抓取技术对几个真实的网站进行抓取的实例,旨在帮助读者活学活用书中介绍的技术。
《用Python写网络爬虫(第 2版》适合有一定Python编程经验而且对爬虫技术感兴趣的读者阅读。
畅销的Python网络爬虫开发实战图书全新升级版,上一版年销量近40000册。
针对Python 3.6版本编写。
提供示例完整源码和实例网站搭建源码,确保用户能在本地成功复现爬取网站环境,并保障网站的稳定性与可靠性以及代码运行结果的可再现性。
Internet上包含了许多有用的数据,其中大部分是可以免费公开访问的。但是,这些数据不容易使用,它们内嵌在网站的架构和样式中,在提取时也需要多加小心。网络爬取技术作为一种收集和理解网络上海量信息的方式,正变得越来越有用。
本书是使用Python 3.6的新特性来爬取网络数据的入门指南。本书讲解了从静态网站提取数据的方法,以及如何使用数据库和文件缓存技术来节省时间并管理服务器负载,然后介绍了如何使用浏览器、爬虫和并发爬虫开发一个更为复杂的爬虫。
借助于PyQt和Selenium,你可以决定何时以及如何从依赖JavaScript的网站上爬取数据,以及更好地理解在受CAPTCHA保护的复杂网站上提交表单的方法。本书还讲解了使用Python包(比如mechanize)进行自动化处理的方法、使用Scrapy库创建基于类的爬虫的方法,以及如何在真实的网站上实施所学的爬虫技巧。
本书最后还涵盖了使用爬虫对网站进行测试、远程爬取技术、图像处理以及其他相关的主题。
本书主要内容如下:
使用简单的Python程序从页面中提取数据;
构建并发爬虫,对页面进行并行处理;
通过跟踪链接来爬取一个网站;
从HTML中提取特性;
缓存下载的HTML,以供复用;
比较并发模型,确定比较快的爬虫;
解析依赖于JavaScript的网站;
与表单和会话进行交互。
Katharine Jarmul是德国柏林的一位数据科学家和Python支持者。她经营了一家数据科学咨询公司——Kjamistan,为不同规模的企业提供诸如数据抽取、采集以及建模的服务。她从2008年开始使用Python进行编程,从2010年开始使用Python抓取网站,并且在使用网络爬虫进行数据分析和机器学习的不同规模的初创企业中工作过。读者可以通过Twitter(@kjam)关注她的想法以及动态。
Richard Lawson来自澳大利亚,毕业于墨尔本大学计算机科学专业。毕业后,他创办了一家专注于网络爬虫的公司,为超过50个国家的业务提供远程工作。他精通世界语,可以使用汉语和韩语对话,并且积极投身于开源软件事业。他目前正在牛津大学攻读研究生学位,并利用业余时间研发自主无人机。
译者介绍
李斌,毕业于北京科技大学计算机科学与技术专业,获得硕士学位。曾任职于阿里巴巴,当前供职于凡普金科,负责应用安全工作。热爱Python编程和Web安全,希望以更加智能和自动化的方式提升网络安全。博客地址为pythoner.com。
第 1章 网络爬虫简介 1
1.1 网络爬虫何时有用 1
1.2 网络爬虫是否合法 2
1.3 Python 3 3
1.4 背景调研 4
1.4.1 检查robots.txt 4
1.4.2 检查网站地图 5
1.4.3 估算网站大小 6
1.4.4 识别网站所用技术 7
1.4.5 寻找网站所有者 9
1.5 编写第 一个网络爬虫 11
1.5.1 抓取与爬取的对比 11
1.5.2 下载网页 12
1.5.3 网站地图爬虫 15
1.5.4 ID遍历爬虫 17
1.5.5 链接爬虫 19
1.5.6 使用requests库 28
1.6 本章小结 30
第 2章 数据抓取 31
2.1 分析网页 32
2.2 3种网页抓取方法 34
2.2.1 正则表达式 35
2.2.2 Beautiful Soup 37
2.2.3 Lxml 39
2.3 CSS选择器和浏览器控制台 41
2.4 XPath选择器 43
2.5 LXML和家族树 46
2.6 性能对比 47
2.7 抓取结果 49
2.7.1 抓取总结 50
2.7.2 为链接爬虫添加抓取回调 51
2.8 本章小结 55
第3章 下载缓存 56
3.1 何时使用缓存 57
3.2 为链接爬虫添加缓存支持 57
3.3 磁盘缓存 60
3.3.1 实现磁盘缓存 62
3.3.2 缓存测试 64
3.3.3 节省磁盘空间 65
3.3.4 清理过期数据 66
3.3.5 磁盘缓存缺点 68
3.4 键值对存储缓存 69
3.4.1 键值对存储是什么 69
3.4.2 安装Redis 70
3.4.3 Redis概述 71
3.4.4 Redis缓存实现 72
3.4.5 压缩 74
3.4.6 测试缓存 75
3.4.7 探索requests-cache 76
3.5 本章小结 78
第4章 并发下载 79
4.1 100万个网页 79
4.2 串行爬虫 82
4.3 多线程爬虫 83
4.4 线程和进程如何工作 83
4.4.1 实现多线程爬虫 84
4.4.2 多进程爬虫 87
4.5 性能 91
4.6 本章小结 94
第5章 动态内容 95
5.1 动态网页示例 95
5.2 对动态网页进行逆向工程 98
5.3 渲染动态网页 104
5.3.1 PyQt还是PySide 105
5.3.2 执行JavaScript 106
5.3.3 使用WebKit与网站交互 108
5.4 渲染类 111
5.5 本章小结 117
第6章 表单交互 119
6.1 登录表单 120
6.2 支持内容更新的登录脚本扩展 128
6.3 使用Selenium实现自动化表单处理 132
6.4 本章小结 135
第7章 验证码处理 136
7.1 注册账号 137
7.2 光学字符识别 140
7.3 处理复杂验证码 144
7.4 使用验证码处理服务 144
7.4.1 9kw入门 145
7.4.2 报告错误 150
7.4.3 与注册功能集成 151
7.5 验证码与机器学习 153
7.6 本章小结 153
第8章 Scrapy 154
8.1 安装Scrapy 154
8.2 启动项目 155
8.2.1 定义模型 156
8.2.2 创建爬虫 157
8.3 不同的爬虫类型 162
8.4 使用shell命令抓取 163
8.4.1 检查结果 165
8.4.2 中断与恢复爬虫 167
8.5 使用Portia编写可视化爬虫 170
8.5.1 安装 170
8.5.2 标注 172
8.5.3 运行爬虫 176
8.5.4 检查结果 176
8.6 使用Scrapely实现自动化抓取 177
8.7 本章小结 178
第9章 综合应用 179
9.1 Google搜索引擎 179
9.2 Facebook 184
9.2.1 网站 184
9.2.2 Facebook API 186
9.3 Gap 188
9.4 宝马 192
9.5 本章小结 196