有人爬取数据分析黄金周旅游景点,有人爬取数据分析相亲,有人大数据分析双十一,连小学生写论文都用上了大数据。
最近,AI的兴起让Python火了一把。实际上Python拥有庞大的第三方支持,生态系统非常完整,可以适用各种场景和行业。
这次,我们准备通过Python学习爬虫的开发,既简单有趣,而且是数据采集重要一环。同时脱离应用谈技术就是耍流氓,通过制作电子书学习数据的收集与整理,即能学到东西又有实用价值。
我们将通过爬取网页信息这个很小的应用场景来体会数据预处理的思想,并从中学习了解数据处理中抓取、处理、分组、存储等过程的实现。
1Python开发
1.1Windows下环境安装
熟悉Windows的安装Python不难,首先官网下载
有两个版本,根据需要选择自己的版本,现在越来越多的库开始支持3,所以建议下载3,这里我们以2为例。
双击下载的安装文件,一路Next即可,但是要注意勾选
__pip__
和Addpython.exetoPath
pip是Python生态体系里面的包管理工具,很多第三方库可以通过它方便的管理。
安装Finish之后,打开命令行窗口,输入Python:
如果出现这个界面说明安装成功了,如果出现下面的情况:
‘python’不是内部或外部命令,也不是可运行的程序或批处理文件。
需要把python.exe的目录添加到path中,一般是C:/Python27。
1.2Python之HelloWorld
目前我所接触过的所有编程语言都只要掌握三个内容就可以了:就是输入、处理、输出。我们已经安装好了Python,可以来一个最俗套的程序。
首先我们打开windows的控制台,然后输入python回车,然后输入如下代码:
我就问你俗不俗,好了,看结果:
根据我上面的说法,这个程序的输入就是HelloWorld字符串,处理使系统内部的输出处理,输出结果就是‘HelloWorld’。
我们还可以把代码写在文件里面:
执行效果:
我们说这个不是单纯的秀一下,以前没有用户界面的时候print可以作为人机交互用途,现在多数是用于调试,可以在程序运行的时候快速的输出程序结果或者过程结果。
1.3做菜与编程
现在有个很有意思的说法:生数据(原始数据)就是没有处理过的数据,熟数据(CookedData)是指原始数据经过加工处理后的数据,处理包括解压缩、组织,或者是分析和提出,以备将来使用。
这就像做菜生菜是输入,菜谱是程序,洗、切、烹饪等处理是程序执行过程,最后输出的熟菜。但不管生菜、熟菜都是菜,或者都是物质。
准备食材
在程序世界里的物质组成就是数据,就像有萝卜白菜等不同的品种一样,数据也有不同的类型。我目前所接触到的数据类型主要有以下几种:
物理类:数据在物理内存中的表达存储方式;
位
字
字节
数据类:数据类中的具体类型代表了不同精度和内存中不同的存储结构;
整数
浮点数
长整型
双精度
字符
字符串
逻辑类:就是逻辑真与逻辑假;
布尔值
复合类:由各基本的数据类型按照一定的结构组合而成的数据;
结构体
类
集合
字典
列表
序列
Hash表
……
这里我强调几点:
首先,这个分类不是某种语言特有,目前大多数编程语言都差不多,你理解这个思想就把自己的编程能力扩展了。
其次,它不需要专门记忆,编程是程序性的知识,运用的知识,是一种技能,你要做什么菜,你来这个分类查查需要什么原材料,再去具体研究,慢慢就会了,不做你记住了也没用。
器皿
食材已准备好了,可以下锅,可锅在哪里,你不能放在手里加工。程序里我们用变量、常量来盛各种数据,还有个作用域的问题,严格的厨房红案和白案是分开的,有时候砧板是不能互用的。
空值:四大皆空,什么也不是,不是0,不是长度为0的字符串,不是false,什么都不是;
变量:学过数学的人都应该有这个概念,反正差不多;
常量:固定不变的量,比如说π。
烹饪手法
刚查了下,我大天朝常用的烹饪手法多达20多种,我归纳了一下,编程大概就那么几种:
数值计算——加减乘除、位移等;
逻辑计算——逻辑真假判断;
过程计算——循环、嵌套、递归等;
数据处理——字符串、对象的操作。
菜谱与炒菜
菜都准备好了,下锅怎么炒,全靠菜谱,它就是程序,而我们按照菜谱炒菜这个过程就是程序的执行。
Python或任何一种编程语言都是博大精深,同时又是一种技能,不可能在使用之前完全掌握,也没必要。
我们需要知道的是我们想吃什么(程序要输出什么),然后再去菜市场买时才找菜谱(搜索引擎查资料),最后按照我们的需求加工(编程)。
1.4Python简单实践
首先我们来写三个Python文件:
hello.py
——事情的处理有落点,程序执行有入口,例如:main,这个文件可以看作程序的入口。
pkg.py
——程序可以分块编写,这样层次更分明,易于理解和维护,我们在pkg.py中编写一部分功能,作为演示模块。
init.py
——这是一个空文件,也可以写代码,表明当前路径是包。
接下来,我们来运行一下:
pythonhello.py
显示结果如下:
HelloWorld!
Hereispkg’stest
Mike
23
我们运行了hello.py文件,然后hello.py导入了包pkg;包pkg定义了一个方法和一个类,我们在hello.py文件里面调用了外部的方法和类。
2使用Scrapy抓取电子书
2.1写在爬取数据之前
好了,现在我们找一个在线看书的网站,找一本书把它下载到本地。首先,我们准备下载工具,就是Python的爬虫框架Scrapy。
2.2Scrapy安装
安装完Python后可以用以下的命令按照Scrapy,有些版本的Python没有带pip需要手动安装。
pipinstallscrapy
pip是Python的包管理器,大量的第三方包或者说功能可以通过这个工具来管理,所谓包就是模块化的功能集合,基本的技术参考实践里面的包。
我安装成功显示如下信息:
2.3新建Scrapy爬虫项目
Scrapy是Python程序,同时也是一套框架,提供了一系列工具来简化开发,因此我们按照Scrapy的模式来开发,先新建一个Scrapy项目,如下:
scrapystartprojectebook
Scrapy项目包含一些基础框架代码,我们在此基础上开发,目录结构类似下图:
2.4新建Scrapy爬虫
这时,Scrapy还不知道我们要爬取什么数据,所以我们要用Scrapy工具新建一个爬虫,命令如下:
scrapygenspiderexampleexample.com
下面实操,我们在起点中文网找一篇免费小说的完本,这里选择是《修真小主播》。
我们就在前面建立的Scrapy项目ebook下新建一个爬虫,命令如下:
cdebookscrapygenspiderxzxzbqidian.com
执行成功之后,在项目的spider目录下就多了一个xzxzb.py的文件。
2.5爬虫思路
怎么抓取数据,首先我们要看从哪里取,打开《修真小主播》的页面,如下:
2.6获取章节地址
现在我们打开xzxzb.py文件,就是我们刚刚创建的爬虫:
start_urls就是目录地址,爬虫会自动爬这个地址,然后结果就在下面的parse中处理。现在我们就来编写代码处理目录数据,首先爬取小说的主页,获取目录列表:
获取网页中的DOM数据有两种方式,一种是使用CSS选择子,另外一种是使用XML的xPath查询。
这样,可以说爬取章节路径的小爬虫就写好了,使用如下命令运行xzxzb爬虫查看结果:
scrapycrawlxzxzb
这个时候我们的程序可能会出现如下错误:
…
ImportError:Nomodulenamedwin32api
运行下面的语句即可:
pipinstallpypiwin32
屏幕输出如下:
爬取章节路径的小爬虫就写好了,但我们的目的不仅于此,我们接下来使用这些地址来抓取内容:
2.7章节页面分析
我们接下来分析一下章节页面,从章节页面我们要获取标题和内容。
如果说章节信息爬取使用的parser方法,那么我们可以给每一个章节内容的爬取写一个方法,比如:parser_chapter,先看看章节页面的具体情况:
可以看到,章节的整个内容在类名为main-text-wrap的div标签内,标题是其中类名为
j_chapterName
的h3标签,具体内容是类名为
read-contentj_readContent
的div标签。
试着把这些内容打印出来:
上一步,我们获取到了一个章节地址,从输出内容来看是相对路径,因此我们使用了
yieldresponse.follow(url,callback=self.parse_chapter)
,第二个参数是一个回调函数,用来处理章节页面,爬取到章节页面后我们解析页面和标题保存到文件。
next_page=response.urljoin(url)yieldscrapy.Request(next_page,callback=self.parse_chapter)
scrapy.Request不同于使用response.follow,需要通过相对路径构造出绝对路径,response.follow可以直接使用相对路径,因此就不需要调用urljoin方法了。
注意,response.follow直接返回一个Request实例,可以直接通过yield进行返回。
数据获取了之后是存储,由于我们要的是html页面,因此,我们就按标题存储即可,代码如下:
至此,我们已经成功的抓取到了我们的数据,但还不能直接使用,需要整理和优化。
2.8数据整理
我们先给章节排个序,因为目录中的章节列表是按顺序排列的,所以只需要给下载页面名称添加一个顺序号就行了。
可是保存网页的代码是回调函数,顺序只是在处理目录的时候能确定,回调函数怎么能知道顺序呢?因此,我们要告诉回调函数它处理章节的顺序号,我们要给回调函数传参,修改后的代码是这样的:
不知道大家注意到没有,前面的分析中目录已经提供了一个
data_rid
可以作为排序号,我们在目录分析页面获取这个序号,然后通过request的meta传入
parse_chapter
。
在
中通过response的meta获取传入的参数,然后文件名中加入这个顺序好完成了排序。另外,Sigil找那个通过H1标签来生成目录,需要目录的话,我们需要给内容添加一个h1标签。
还有可读性差的问题,也许我们下载的网页可能会包含一些乱七八糟的东西,我们有很多办法,也可以使用readbility等第三方库,这里就不深入了。
3使用Sigil制作电子书
电子书的制作,完全就是工具的应用,非常简单,这里把流程过一下,大家根据兴趣自行深入。
3.1Sigil简介
3.2ePub电子书简介
ePub(ElectronicPublication的缩写,意为:电子出版),是一个自由的开放标准,属于一种可以“自动重新编排”的内容;也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示。
3.3加载html文件
要制作ePub电子书,我们首先通过Sigil把我们的抓取的文件加载到程序中,在添加文件对话框中我们全选所有文件:
内容都是HTML文件,所以编辑、排版什么的学习下HTML。
3.4制作目录
文件中存在HTML的h标签时,点击生成目录按钮就可以自动生成目录,我们在前面数据抓取时已经自动添加了h1标签:
3.5制作封面
封面本质上也是HTML,可以编辑,也可以从页面爬取,就留给大家自己实现吧。
3.6编辑元数据
编辑书名、作者等信息:
3.6输出ePub
编辑完成后保存,取个名字:
输出可以使用电子书阅读软件打开查看,我用的是Calibre,还可以方便的转换为相应的格式装到Kindle中阅读。