怎么爬取动态网页?之前学习requests模块的时候,我们借助于Ajax请求,获取动态加载的数据,后来学习了selenium,我们也可以轻松获取动态加载的网页,那么scrapy怎么获取动态加载的内容呢?我们接下来以一个案例:爬取网易新闻数据为例,来介绍怎么爬取动态加载的内容,其中会涉及到的知识点包括下载器中间件。
1.下载器中间件是什么?

中间件是Scrapy里面的一个核心概念。使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫。
2.爬取网易新闻思路讲解
目的:获取国内、国际、军事新闻板块中所有的新闻标题以及对应的新闻内容

1)我们要想获取想要的数据内容,就需要先对首页发起请求解析得到列表页的url

2)然后我们再对列表页发起请求解析获得详情的地址

3)最后通过第二步获得的详情的地址获得详情页的内容

4)难点:第一步正常发请求解析数据,第二步,我们会发现列表页的数据是动态加载的数据,因此我们无法运用解析数据获得详情页的url,因此需要借助下载器中间件来获取动态加载的内容。
怎么爬取网易新闻内容。首先我们通过对首页发送请求获取到板块的链接地址。
1.对首页发送请求
我们讲地址改为我们需要爬取的首页内容地址

2.获取板块的链接地址。
1)我们通过查看代码可以看到,我们需要的板块信息事在li标签中存储,因此我们先定位到li标签


2)然后我们可以通过不同的li标签定位到不同的板块,我们首先新建一个列表,存放板块在li标签中的位置,再通过解析获取所想要的板块链接

3)我们获取到了5个板块的链接,那么我们新建一个列表把这些链接存储在列表中


3.对板块列表页发送请求
我们通过上一步获得到了列表页的链接,就可以对列表页发送请求了,通过yield关键字可以发送请求

4.对板块列表页解析数据
我们要想获取详情页的内容,需要对列表页解析获得详情页的URL地址,
因此我们定义一个名为urls_parse的函数,用于解析数据,在上一步callback中我们已经说明了列表页解析使用urls_parse的函数

5.下载中间件的编写
我们这一步正常来说是可以解析到数据的,但是我们通过上一节课的分析知道,列表页是动态加载数据,无法直接通过scrapy获取,需要借助于中间件,因此我们下节课重点根据案例详细介绍中间件怎么写,才能获取我们想要的数据。
我们列表页无法直接获取数据,因为是动态加载页面,因此需要借助中间件来完成我们的案例。接下来我们开始中间件的介绍。
1.首先我们打开中间件文件(如下图)
中间件文件打开,我们会发现有很多函数和类,我们只保留一个类(DownloaderMiddleware)和三个函数(process_request、process_response、process_exception),它们分别代表着请求、相应和异常。

2.修改响应函数
由于我们列表页是动态加载的数据因此,我们通过一般途径无法获取的是响应数据,因此我们对响应函数进行修改。我们知道我们会得到6个相应数据,分别是,首页以及列表5个板块的响应数据,我们目的是对5个板块的响应数据进行修改,因此我们设置条件进行过滤,如果请求的URL,在蜘蛛抓取的URL中,那么我们获取新的响应数据

3.获取新的响应数据
我们需要导入一个函数,这个函数我们需要获得几个数据:URL是我们过滤的URL,body使我们获取的响应数据


4.body的获取
1)body是我们需要获取的响应数据,怎么获取动态响应数据呢?用selennim!首先在爬虫文件夹中导入selennim,并实例化浏览器

2)然后再中间件文件中导入实例化的浏览器,并发送请求,就获取到了响应数据

接下来就可以正常的通过scrapy解析数据了。
1.详情页的链接获取
通过解析获得了详情的标题和链接

2.对详情页发送请求
通过yield关键字对详情页发送请求

3.对详情页解析数据

4.将标题及内容,设置在item中

5.将标题及内容进行封装
首先将标题封装到item中,其次由于标题及内容在不同的解析数据中因此,使用meta关键字,然后在内容解析数据中导入meta关键字,并封装到item中



6.将item提交给管道,管道内容自行设置

7.设置开启管道

8.将浏览器关闭

这样我们就把网易新闻的案例讲解完了,主要的难点在于中间操作,中间件需要先找到需要调整的数据,并利用selenim进行获取数据,两者的配合最终得到动态加载的数据,其他的操作跟我们之前的翻页获取以及深度爬取数据操作是一样的。