网络爬虫(Web crawler),有时候也叫网络蜘蛛(Web spider),是指这样一类程序——它们可以自动连接到互联网站点,并读取网页中的内容或者存放在网络上的各种信息,并按照某种策略对目标信息进行采集(如对某个网站的全部页面进行读取)。实际上,世界上最大的网站——Google搜索本身就建构在爬虫技术之上,像Google、百度这样的搜索引擎会通过爬虫程序来不断更新自身的网站内容和对其他网站的网络索引。某种意义上说,我们每次通过搜索引擎查询一个关键词,就是在搜索引擎服务者的爬虫程序所“爬”到的信息中进行查询。当然,搜索引擎背后所使用的技术十分复杂,其爬虫技术通常也不是一般个人所开发的小型程序所能比拟的,不过,爬虫程序本身其实并不复杂,只要懂一点编程知识,了解一点HTTP和HTML,就可以写出属于自己的爬虫,实现很多有意思的功能。
1.1 了解python
Guido van Rossum在1989年发明了Python,而Python的第一个公开发行版发行于1991年。因为Guido是一部电视剧“Monty Python’s Flying Circus”的爱好者,因此将这种新的脚本语言命名为Python。从最根本的角度来说,Python是一种解释型、面向对象的、动态数据类型的高级程序设计语言。注:Python是开源的,源代码遵循GPL(GNU General Public License)协议,对所有个人开发者是完全开发的。
python的简明语法和各式各样的开源库使得Python在网络爬虫方向得天独厚,对于个人开发爬虫程序而言,一般对于性能的要求不会太高,因此,虽然我们一般认为Python在性能上难以与C/C++和Java相比,但总的来说,使用Python有助于更好更快地实现我们所需要的功能。另外,考虑到Python社区贡献了很多各有特色的库,很多都能直接拿来编写我们的爬虫程序,因此,Python的确是目前最好的选择。
1.2 配置开发环境
在开始探索Python的世界之前,我们首先需要在自己的机器上安装Python。值得高兴的是,Python不仅免费、开源,而且坚持轻量级,安装过程并不复杂。如果使用Linux系统,可能已经内置了Python(虽然版本有可能是较旧的),使用苹果电脑(macOS系统)的话,一般也已经安装了命令行版本的Python 2.x。在 Linux 或 macOS X 系统上检测 Python 3 是否安装的最简单办法是使用终端命令,在terminal应用中输入python3命令并回车执行,观察是否有对应的提示出现。至于Microsoft Windows系统,在目前最新的Win10版本上也并没有内置Python,因此我们必须手动安装。
1.2.1 windows上安装
Python官网
这里需要注意的是选择对应架构的版本,我们需要首先搞清楚自己的系统是32位还是64位的
根据安装程序的导引,我们一步步进行,就能完成整个安装。如果最终看到类似图1-2这样的提示,就说明安装成功。
这时检查我们的“开始”菜单,就能看到Python3.x的应用程序,其中有一个“IDLE”(意为“integrated development environment”)程序,我们可以单击此项目开始在交互式窗口中使用Python Shell。
1.2.2 在Ubuntu和MacOS上安装
Ubuntu是诸多Linux发行版中受众较多的一个系列。我们可以通过Applicatons中的添加应用程序进行安装,在其中搜索Python3,并在结果中找到对应的包,进行下载。如果安装成功,我们将在Applications(应用程序)中找到Python IDLE,进入Python Shell中。
访问 Python官网并下载对应的 Mac 平台安装程序,根据安装包的指示进行操作,我们最终将看到类似的成功提示:
关闭该窗口,并进入Applications(或者是从LaunchPad页面打开)中,我们就能找到Python Shell IDLE,启动该程序,看到的结果应该和Windows平台上的结果类似。
1.3 Python基本语法介绍
1.3.1 hello world
输出一行“Hello, World”,在C语言中需要的程序语句是这样的:
而在Python里,可以用一行完成。
1.3.2 数据类型
在Python中内置的主要数据类型包括:
1、Number,数值类型。可以是 Integers(1 和 2)、Float(1.1 和 1.2)、Fractions(1/2 和 2/3)、或者是 Complex Number(数学中的复数)。
2、String,字符串,主要描述文本。
3、List,列表,一个包含元素的序列。
4、Tuple,元组,和列表类似,但是是不可变的。
5、Set,一个包含元素的集合,其中的元素是无序的。
6、Dict,字典,由一些键值对构成。
7、Boolean,布尔类型,其值或为 True 或为 False
8、Byte,字节, 例如一个以字节流表示的JPG文件
int和float之间,Python一般会使用是否有小数点来做区分
这里需要注意的是,将一个 int 与一个 int 相加将得到一个 int 。但将一个 int 与一个 float 相加将得到一个 float 。
这是因为Python会 把 int 强制转换为 float 以进行加法运算:
使用内置的关键字进行int与float之间的强制转换是经常用到的:
Python2中曾有int和long(长整数类型)的区分,但在Python3中,int吸收了2.x版本中的int和long,不再对较大的整数和较小的整数做区分。有了数值,我们就有了数值运算:
|
Python中还有相对比较特殊的分数和复数,分数可以通过fractions模块中的Fraction对象构造:
复数可以用使用函数 complex(real, imag) 或者是带有后缀j的浮点数来创建:
布尔类型本身非常简单,Python中的布尔类型以True和False两个常量为值:
不过Python中对布尔类型和if else判断的结合比较灵活
在介绍字符串之前,我们先对list(列表)和tuple(元组)做一个简单的了解,因为list涉及一个Python中非常重要的概念:可迭代对象。对于列表而言,序列中的每一个元素都在一个固定的位置上(称之为索引),索引从“0”开始。列表中的元素可以是任何数据类型,Python中列表对应的是中括号“[]”的表示形式。
列表切片(slice)可以简单地描述为从列表中取一部分的操作,通过指定两个索引值,可以从列表中获取称作“切片”的某个部分。返回值是一个新列表,从第一个索引开始,知道第二个索引结束(不包含第二个索引的元素),列表切片的使用非常灵活:
向一个list中添加新元素的方法也很多样,常见的包括:
这里要注意的是extend接受一个列表,并把其元素分别添加到原有的列表,类似“扩展”。而append是把参数(参数有可能也是一个列表)作为一个元素整体添加到原有的列表中。insert() 方法会将单个元素插入到列表中。第一个参数是列表中将插入的位置(索引)。
从列表中删除元素,可使用的方法也不少:
元组(tuple)与列表非常相似,最大的区别在于:1,元组是不可修改的,定义之后就“固定”了。2,元组在形式上是用“()”这样的圆括号括起来的。由于元组是“冻结”的,所以不能插入或删除元素。其他一些操作与列表类似:
【提示】元素可修改与不可修改是列表与元组最大(或者说唯一)的区别,基本上除了修改内部元素的操作,其他列表适用的操作都可以用于元组。
在创建一个字符串时,我们将其用引号括起来,引号可以是单引号(')或者双引号("),两者没有区别。字符串也是一个可迭代对象,因此,与取得列表中的元素一样,也可以通过下标记号取得字符串中的某个字符,一些适用于list的东西同样适用于str:
集合的特点是无序且值唯一,创建集合和操作集合的常见方式包括:
字典(dict)相对于列表、元组和集合,会显得稍微复杂一点。Python中的字典是键值对(key-value)的无序集合。在形式上也和集合类似,创建字典和操作字典的基本方式如下: