前言
我们以一个静态网站作为案例进行练习,网站链接为:https://ssr1.scrape.center/,这个网站里面包含一些电影信息。网站首页如下图所示:
我们点击其中一部电影,会进入该电影的详情页面,如下图所示:
我们需要爬取的信息为每部电影的名称、封面、类别、上映时间、评分、剧情介绍等内容,并把爬取的内容保存为JSON 文本文件,并使用多进程实现爬取加速;。
爬取过程
这个网站有10个列表页,每个列表页有有10部电影,可以先爬取列表页的信息,从获取到的信息中获取详情页的URL,从而获取每部电影详情页的信息,对爬取的信息用正则表达式获取自己需要的数据,最后将数据保存在文件中。
爬取列表页
我们首先观察列表页的结构和翻页规则,在浏览器中访问https://ssr1.scrape.center/,然后打开浏览器开发者工具,如下图所示:
发现每部电影对应的区块都是一个 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、首先引入一些必要的库和定义一些基础变量,再编写一个函数完成一个页面的爬取:
2、编写一个函数自动生成每个列表页的 URL并返回爬取结果;
3、编写一个函数来解析列表页,获取每部电影详情页的 URL;.
到此,列表页抓取完成。
爬取详情页
首先打开一个详情页的页面源码,分析要获取信息的节点,然后再使用正则表达式获取自己想要的信息,定义一个爬取详情页的方法,实现如下:
然后定义一个解析详情页的方法,它接收一个参数为html,解析其中的内容并以字典的形式返回, 实现如下:
保存数据
成功提取详情页信息后,下一步就是保存数据,这里将数据保存为文本形式,如下所示:
这里我们首先定义保存数据的文件夹RESULTS_DIR,然后判断这个文件夹是否存在,如果不存在则创建一个。接着我们定义保存数据的方法save_data,将数据以json形式保存。
最后定义一个总的调用方法main,将之前的方法整合在一起,如下所示:
多进程加速
由于爬取是单线程的,而且只能逐条爬取,因此速度比较慢,可以对爬取过程进行优化,使用多进程爬取,具体实现代码如下:
我们首先给main方法添加了一个参数page,用以表示列表页的页码,接着声明一个进程池,最后进程池的大小根据我们的机器cup的核数,如果有8个核,则会有8个进程并行运行。
测试结果
脚本输出结果如下:
保存的数据如下:
标签:URL,电影,爬虫,列表,爬取,详情页,如下,页面 From: https://blog.51cto.com/u_15634210/6163617