字节流的博客

《Python 网络数据采集》 - 笔记

《Python 网络数据采集》封面

推荐指数:⭐⭐


1. 创建爬虫

1. BeautifulSoup

第一章开始便介绍了 BeautifulSoup(万幸没有从 Python 基础语法讲起),BeautifulSoup 的基本功能及使用场景。在不同操作系统的安装方式,以及如何使用 urllib 发送一个简单的 HTTP 请求,并使用 BeautifulSoup 解析请求响应的内容。

其中介绍了 BeautifulSoup 最常用的两个方法 find()findAll(),并作了简单的区分:因为 find() 方法并没有 limit 参数,所以,find() 方法相当于 limit = 1 的 findAll() 方法,如下代码是等价的:

1
2
3
4
5
soup.find_all('title', limit=1)
# [<title>The Dormouse's story</title>]

soup.find('title')
# <title>The Dormouse's story</title>

官方文档也是如此说的:

The only difference is that find_all() returns a list containing the single result, and find() just returns the result.

后面介绍了在 BeautifulSoup 中如何使用正则表达式,如何获取标签的属性值等一些最基础的东西,完全可以浏览官方文档及示例搞清楚的。

2. 开始采集

数据采集中,引入了”维基百科六度分割理论“,以此来说明爬虫对服务器所造成的压力。六度分割理论可参考维基百科

在讲述爬取全站的章节中,因为需要递归新链,提到了 Python 递归层数的问题,因为 Python 默认递归 depth 是有限的,所以在爬取全站递归新链时要注意递归溢出的异常处理。当然,你也可以通过以下代码来对 Python 的递归作出限制:

1
2
import sys
sys.setrecursionlimit(1500)

详情可参考官方文档

后面还提到了 Web 爬虫框架:Scrapy,Scrapy 入门和使用很简单,安装成功之后,执行命令 scrapy genspider 即可生成代码框架,往相应的模块中添加对应的代码即可完成。入门可参考 Scrapy 框架学习

第四章讲述了如何请求 API,然后从 HTTP 协议讲起,请求方法,状态码等,可参考《图解 HTTP》笔记。最后还讲了 Twitter 和 Google 的 API,以及 Python 中 JSON 的解析,这就很没劲了。😔

3. 数据存储

数据存储,本书中主要提到了数据库存储(MySQL),文件存储(CSV)和发送邮件存储(Email)。

MySQL 存储没什么好说的,主要是 Python 语言对 MySQL 的 CRUD 操作。

对于 CSV 文件的读写,书中提到了 csv 模块,其中提到的 csv.DictReader() 比较好用,可以将 CSV 文件读取成一个字典,并且自动避过第一行的标题,就不会专门为了标题在程序中多写一行代码了。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from urllib.request import urlopen
from io import StringIO
import csv

data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").
.read().decode('ascci', 'ignore')
dataFile = StringIO(data)
dictReader = csv.DictReader(dataFile)

# print fields
print(dictReader.fieldnames)

# print rows
for row in dictReaders:
print(row)

本章最后还略提了 Python 对应 PDF 和 Word 文档的处理方式及小部分示例代码。提到了 PDF 解析库 - PDFMiner3K 和 Word 解析库 - python-docx,如果需要相关操作,查看对应官方文档即可。

2. 高级数据采集

1. 数据清洗及处理

数据采集之后,必然要对采集的数据进行清洗。清洗数据的时机可以在爬取结束后,对数据进行清洗,然后存储。当然,也可以在数据存储后,再对数据进行清洗。

爬取结束后存储前对数据进行清洗,主要是对数据的一些特殊字符,如:回车换行符,HTML 标签,不必要的标点符号等。

在存储前,还可以对数据格式进行标准化。IP 地址格式化,手机号码的格式化,对一些字段可以做 ngram 等。

在存储后,可以使用 OpenRefine 对数据进行清洗。OpenRefine 提供了可视化界面,你可以 OpenRefine 直观的看到存储的数据,并可以使用正则表达式等对数据进行检索,对检索的数据进行编辑修改。作者提到 OpenRefine 的意思是方便不懂程序的人来对数据进行编辑清洗。如果你放心这些人对你的数据进行清洗的话,可以试试这个工具。Good luck 😘

自然语言处理部分提到了使用 NLTK,可以使用 NLTK 做统计分析和词性分析。当然,按本书的风格,也是从安装开始讲起,然后一个小例子结束,欧耶。如果要处理自然语言,可能少不了分词,推荐梁博的永久免费的基于深度学习的中文在线抽词-PullWord

2. 与浏览器的交互

与浏览器交互,主要是一些表单的提交,文件上传,登录和 cookie,HTTP 接入和认证等。基本上有 Requests 库就可以搞定了。Requests 用起来很简单,文档也很详尽,这有一个简单的例子

对于通过 AJAX 请求加载页面内容的页面,可能就需要 Selenium WebDriver 或者 PhantomJS 这样的工具来解决这个问题了。

验证码识别也是爬虫中最常见的,可以使用线使用 Pillow 等 Python 图片处理库对验证码图片进行预处理。然后使用 OCR 工具 Tesseract 进行文字识别。自己可以通过训练数据来提高 Tesseract 的识别率。总体来说,数据训练的成本还是比较高的,如果可以的话,采用第三方打码平台也是个不错的选择。

总结

本书提到了爬虫常用的工具,遇见的情况,及常见的解决方案。但只是对每一个工具进行简单地介绍,并作了些示例代码。如果想具体了解每一个工具的具体使用方式,还是要看官方文档的。嗯,看官方文档很重要。总体来说,本书内容比较基础,可以作为入门参考读物翻一翻。

Thanks! 😊