1. 爬虫的过程分析
当人类去访问一个网页时,是如何进行的? ① 打开浏览器,输入要访问的网址,发起请求。 ② 等待服务器返回数据,通过浏览器加载网页。 ③ 从网页中找到自己需要的数据(文本、图片、文件等等)。 ④ 保存自己需要的数据。
对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。 首先,对应于上面的①和②步骤,我们要利用 Python 实现请求一个网页的功能。 其次,对应于上面的③步骤,我们要利用 Python 实现解析请求到的网页的功能。 最后,对于上面的④步骤,我们要利用 Python 实现保存数据的功能。
因为是讲一个简单的爬虫,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。
2. 如何用 Python 请求一个网页
作为一门拥有丰富类库的编程语言,利用 Python 请求网页完全不在话下。这里推荐一个非常好用的第三方类库 requests。
2.1 requests
2.1.1 安装方式
打开终端或者 cmd,在里面输入以下指令并回车:
pip3 install requests
一般不会出什么问题,如果下载太慢,是因为 pip 使用的源服务器在国外,可以设置 pip 使用国内镜像源,设置方法可以参考 PyPI 使用国内源。
2.1.2 测试是否安装成功
在命令行中输入 python,敲击回车,进入 Python 交互环境。在里面输入以下代码并回车:
import requests
如果不报错,就安装成功了。
2.2 使用 requests 请求网页
创建一个项目,再创建一个 py 文件,用来写代码。
在里面输入以下代码:
#coding=utf-8
import requests
resp = requests.get('https://www.baidu.com') # 请求百度首页
print(resp.status_code) # 打印请求结果的状态码
print(resp.content) # 打印请求到的网页源码
对上面的代码进行以下简单的分析: 第 1 行到第 4 行,都是为了将字符编码设置为 utf8。 第 2 行:引入 requests 包。 第 4 行:使用 requests 类库,以 get 的方式请求网址 https://www.baidu.com,并将服务器返回的结果封装成一个对象,用变量 resp 来接收它。 第 5 行:一般可以根据状态码来判断是否请求成功,正常的状态码是 200,异常状态码就很多了,比如 404(找不到网页)、301(重定向)等。 第 6 行:打印网页的源码。注意,只是源码。不像是浏览器,在获取到源码之后,还会进一步地取请求源码中引用的图片等信息,如果有 JS,浏览器还会执行 JS,对页面显示的内容进行修改。使用 requests 进行请求,我们能够直接获取到的,只有最初始的网页源码。也正是因为这样,不加载图片、不执行 JS 等等,爬虫请求的速度会非常快。
运行一下代码看看。箭头指向的是状态码,可以看到,200,请求正常。 被圈起来是网页的源码。
3. 如何用 Python 解析网页源码
网页源码我们拿到了,接下来就是要解析了。Python 解析网页源码有很多种方法,比如 BeautifulSoup、正则、pyquery、xpath 等。这里我简单介绍一下。


