前言  

我们以一个静态网站作为案例进行练习,网站链接为:https://ssr1.scrape.center/,这个网站里面包含一些电影信息。网站首页如下图所示:

         

爬虫实战(一)爬取静态页面数据_保存数据

         

我们点击其中一部电影,会进入该电影的详情页面,如下图所示:

爬虫实战(一)爬取静态页面数据_多进程_02

我们需要爬取的信息为每部电影的名称、封面、类别、上映时间、评分、剧情介绍等内容,并把爬取的内容保存为JSON 文本文件,并使用多进程实现爬取加速;。

         

爬取过程  

这个网站有10个列表页,每个列表页有有10部电影,可以先爬取列表页的信息,从获取到的信息中获取详情页的URL,从而获取每部电影详情页的信息,对爬取的信息用正则表达式获取自己需要的数据,最后将数据保存在文件中。

爬取列表页

我们首先观察列表页的结构和翻页规则,在浏览器中访问https://ssr1.scrape.center/,然后打开浏览器开发者工具,如下图所示:

爬虫实战(一)爬取静态页面数据_多进程_03

发现每部电影对应的区块都是一个 div节点,这些节点的class 属性中都有 el-card这个值,每个列表页有10个这样的div节点,也就是10部电影信息。每部电影名称外面都套有一个 a节点,这个a节点带有 href属性,这就是进行详情页的超链接。第一部电影 href的值为/detail/1,加上网站的根 URL 就构成了 https://ssr1.scrape.center/detail/1,这就是这部电影详情页的URL。通过观察每个列表页的URL,发现从第二页开始,列表页URL多了/page/2这部分,2为某一页的页码。

到这里,逻辑基本清晰了,我们要完成列表页的爬取,可以这么实现:

1、遍历所有页码,构造 10 页的列表页 URL;

2、从每个列表页,分析提取出每个电影详情页的 URL;

从代码层面需要这样做:

1、首先引入一些必要的库和定义一些基础变量,再编写一个函数完成一个页面的爬取:

爬虫实战(一)爬取静态页面数据_保存数据_04

2、编写一个函数自动生成每个列表页的 URL并返回爬取结果;

爬虫实战(一)爬取静态页面数据_保存数据_05

3、编写一个函数来解析列表页,获取每部电影详情页的 URL;.

爬虫实战(一)爬取静态页面数据_保存数据_06

到此,列表页抓取完成。

爬取详情页  

首先打开一个详情页的页面源码,分析要获取信息的节点,然后再使用正则表达式获取自己想要的信息,定义一个爬取详情页的方法,实现如下:

爬虫实战(一)爬取静态页面数据_多进程_07

然后定义一个解析详情页的方法,它接收一个参数为html,解析其中的内容并以字典的形式返回, 实现如下:

爬虫实战(一)爬取静态页面数据_保存数据_08

保存数据

   成功提取详情页信息后,下一步就是保存数据,这里将数据保存为文本形式,如下所示:

爬虫实战(一)爬取静态页面数据_数据_09

这里我们首先定义保存数据的文件夹RESULTS_DIR,然后判断这个文件夹是否存在,如果不存在则创建一个。接着我们定义保存数据的方法save_data,将数据以json形式保存。

最后定义一个总的调用方法main,将之前的方法整合在一起,如下所示:

爬虫实战(一)爬取静态页面数据_保存数据_10


多进程加速  

由于爬取是单线程的,而且只能逐条爬取,因此速度比较慢,可以对爬取过程进行优化,使用多进程爬取,具体实现代码如下:

爬虫实战(一)爬取静态页面数据_保存数据_11

我们首先给main方法添加了一个参数page,用以表示列表页的页码,接着声明一个进程池,最后进程池的大小根据我们的机器cup的核数,如果有8个核,则会有8个进程并行运行。

测试结果  

脚本输出结果如下:

爬虫实战(一)爬取静态页面数据_数据_12

保存的数据如下:

爬虫实战(一)爬取静态页面数据_多进程_13