作者简介  · · · · · ·

瑞安·米切尔(Ryan Mitchell)

数据科学家、软件工程师,有丰富的网络爬虫和数据分析实战经验,目前就职于美国格理集团,经常为网页数据采集项目提供咨询服务,并在美国东北大学和美国欧林工程学院任教。

目录  · · · · · ·

前言  xi
第一部分 创建爬虫
第1章 初见网络爬虫  3
1.1 网络连接  3
1.2 BeautifulSoup 简介  5
1.2.1 安装BeautifulSoup  6
1.2.2 运行BeautifulSoup  8
1.2.3 可靠的网络连接以及异常的处理  9

第2章 复杂HTML 解析  13
2.1 不是一直都要用锤子  13
2.2 再端一碗BeautifulSoup  14
2.2.1 BeautifulSoup 的find() 和find_all()  16
2.2.2 其他BeautifulSoup 对象  18
2.2.3 导航树  18
2.3 正则表达式  22
2.4 正则表达式和BeautifulSoup  25
2.5 获取属性  26
2.6 Lambda 表达式  26

第3章 编写网络爬虫  28
3.1 遍历单个域名  28
3.2 抓取整个网站  32
3.3 在互联网上抓取  36

第4章 网络爬虫模型  41
4.1 规划和定义对象  41
4.2 处理不同的网站布局  45
4.3 结构化爬虫  49
4.3.1 通过搜索抓取网站  49
4.3.2 通过链接抓取网站  52
4.3.3 抓取多种类型的页面  54
4.4 关于网络爬虫模型的思考  55

第5章 Scrapy  57
5.1 安装Scrapy  57
5.2 创建一个简易爬虫  59
5.3 带规则的抓取  60
5.4 创建item  64
5.5 输出item  66
5.6 item 管线组件  66
5.7 Scrapy 日志管理  69
5.8 更多资源  70

第6章 存储数据  71
6.1 媒体文件  71
6.2 把数据存储到CSV  74
6.3 MySQL  75
6.3.1 安装MySQL  76
6.3.2 基本命令  78
6.3.3 与Python 整合  81
6.3.4 数据库技术与最佳实践  84
6.3.5 MySQL 里的“六度空间游戏”  86
6.4 Email  88

第二部分 高级网页抓取
第7章 读取文档  93
7.1 文档编码  93
7.2 纯文本  94
7.3 CSV  98
7.4 PDF  100
7.5 微软Word 和.docx  102

第8章 数据清洗  106
8.1 编写代码清洗数据  106
8.2 数据存储后再清洗   111

第9章 自然语言处理  115
9.1 概括数据  116
9.2 马尔可夫模型  119
9.3 自然语言工具包  124
9.3.1 安装与设置  125
9.3.2 用NLTK 做统计分析  126
9.3.3 用NLTK 做词性分析  128
9.4 其他资源  131

第10章 穿越网页表单与登录窗口进行抓取  132
10.1 Python Requests 库  132
10.2 提交一个基本表单  133
10.3 单选按钮、复选框和其他输入  134
10.4 提交文件和图像  136
10.5 处理登录和cookie  136
10.6 其他表单问题  139

第11章 抓取JavaScript  140
11.1 JavaScript 简介  140
11.2 Ajax 和动态HTML  143
11.2.1 在Python 中用Selenium 执行JavaScript  144
11.2.2 Selenium 的其他webdriver  149
11.3 处理重定向  150
11.4 关于JavaScript 的最后提醒  151

第12章 利用API 抓取数据  152
12.1 API 概述  152
12.1.1 HTTP 方法和API  154
12.1.2 更多关于API 响应的介绍  155
12.2 解析JSON 数据  156
12.3 无文档的API  157
12.3.1 查找无文档的API  159
12.3.2 记录未被记录的API  160
12.3.3 自动查找和记录API  160
12.4 API 与其他数据源结合  163
12.5 再说一点API  165

第13章 图像识别与文字处理  167
13.1 OCR 库概述  168
13.1.1 Pillow  168
13.1.2 Tesseract  168
13.1.3 NumPy  170
13.2 处理格式规范的文字  171
13.2.1 自动调整图像  173
13.2.2 从网站图片中抓取文字  176
13.3 读取验证码与训练Tesseract  178
13.4 获取验证码并提交答案  183

第14章 避开抓取陷阱  186
14.1 道德规范  186
14.2 让网络机器人看着像人类用户  187
14.2.1 修改请求头  187
14.2.2 用JavaScript 处理cookie  189
14.2.3 时间就是一切  191
14.3 常见表单安全措施  191
14.3.1 隐含输入字段值  192
14.3.2 避免蜜罐  192
14.4 问题检查表  194

第15章 用爬虫测试网站  196
15.1 测试简介  196
15.2 Python 单元测试  197
15.3 Selenium 单元测试  201
15.4 单元测试与Selenium 单元测试的选择  205

第16章 并行网页抓取  206
16.1 进程与线程  206
16.2 多线程抓取  207
16.2.1 竞争条件与队列  209
16.2.2 threading 模块  212
16.3 多进程抓取  214
16.3.1 多进程抓取  216
16.3.2 进程间通信  217
16.4 多进程抓取的另一种方法  219

第17章 远程抓取  221
17.1 为什么要用远程服务器  221
17.1.1 避免IP 地址被封杀  221
17.1.2 移植性与扩展性  222
17.2 Tor 代理服务器  223
17.3 远程主机  224
17.3.1 从网站主机运行  225
17.3.2 从云主机运行  225
17.4 其他资源  227

第18章 网页抓取的法律与道德约束  228
18.1 商标、版权、专利  228
18.2 侵害动产  230
18.3 计算机欺诈与滥用法  232
18.4 robots.txt 和服务协议  233
18.5 3 个网络爬虫  236
18.5.1 eBay 起诉Bidder’s Edge 侵害其动产  236
18.5.2 美国政府起诉Auernheimer 与《计算机欺诈与滥用法》  237
18.5.3 Field 起诉Google:版权和robots.txt  239
18.6 勇往直前  239
 

涉及知识点:

Beautiful Soup 4

BeautifulSoup支持Python标准库中的HTML解析器(”html.parser”),还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

NLTK

NLP技术用于分析文本,为计算机提供了一种理解人类语言的方法。NLP应用程序的一些例子包括自动文本摘要、主题分隔和情感分析。

Collections – Counter

collections是Python内建的一个集合模块,提供了许多有用的集合类。

counter是一个简单的计数器

Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。

站点robots.txt说明

尊重站点规则合理配置爬虫

Requests重定向

请求是加上allow_redirects = false 阻止重定向

Selenium

访问需加载JS的站点时,可以使用自动化搭配浏览器驱动来运行JS

Xpath

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

JSON

JSON(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。 JSON 数据格式与语言无关。即便它源自JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。

Pillow

PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。

由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。

Tesseract

tesseract库是一个将图像翻译成文字的OCR(光学文字识别)库

pytesseract

主要用于调取Tesseract-ocr进行识别

Numpy

NumPy(Numerical Python) 是 Python 的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Nupmy可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。据说NumPy将Python相当于变成一种免费的更强大的MatLab系统。

商标、版权、专利

无论是商标、专利还是版权在注册申请时都需要进行人工审查,但基于三者不同的特点,审查的重点也不同:

商标审查的是显著性,说的简单点就是能区分出来、跟别人不一样。比如美味牌苹果,就不具有显著性:由于美味是形容词,美味苹果涉及范围太广,这样的词不可能被某一家企业独占,也就无法被区分出来。除了显著性以外,商标还要审查相似性,即在相同类别下,不能存在相同或近似的商标在先申请。如果既有显著性又不存在相似商标,那么商标就差不多可以通过审查了。

专利审查的重点是新颖性,说的简单点,就是这个技术是前无古人的。审查方法也很简单,一般通过查阅现有文献的方法来判断。如果现有文献查不到,那么说明这个专利就具有新颖性。

版权相对特别,因为版权自作者完成之日起就获得了,不需要一个证书来证明自己的权利。看到这里很多人肯定要问,既然如此,为什么还要做版权登记呢?其实,做不做版权登记,作者都享有版权,但谁是原作者就很难证明了。比如,你写了一篇文章,有一天别人用了,你怎么证明这篇文章就是你写的呢?如果你写完文章后,做了版权登记,别人再盗用你文章的时候,你就可以拿出版权证书来维护自己的权益。因此,版权登记,减轻了原作者的举证责任(如果不登记的话,原作者其实很难拿出令人信服的证据,或者说即便能拿出来,所花成本很高,还不如花几百块做个版权登记划算)。

版权登记的审查也相对容易,只做形式审查,不做实质审查,因此申请时间也非常快,一般一个月左右就能申请完成。版权审查的主要是独创性,说的简单点,就是你没有抄袭,其实这事是很难认定的,实务中,也有不少抄袭之作成功地申请了版权登记。