scrapy爬取页面不完全的解决办法

最近在使用scrapy来制作爬虫以爬取一些网站上的信息,但是却出现了一个很奇怪的问题,即在网页中打开待爬取的URL,并在网页源代码中定位了某些待爬取的元素,但是当使用scrapy爬取数据时,却发现报错了,而错误竟然是所爬取到的网页中并没有我在浏览器中看到的元素,即对于同一个URL,爬取到的页面和我在浏览器中打开所看到的页面不一样!
在反复确认CSS类选择器没写错,爬虫所爬取的URL没有被重定向到另外的页面后,我发现事情并不简单。
在这里插入图片描述
而后我机缘巧合之下在不修改任何代码的情况下重新运行了一遍,却发现又爬取成功了,然后再试一次,又报错了,这时候我就知道,肯定是爬取到的页面是没有加载完全的页面了

页面没加载完全的情况,我首先想到的有两种可能:
其一,部分数据是在网页加载中由js动态写入的,即在第一次请求中部分数据传给了js并由js在前端进行处理后再显示到页面上;
其二,便是网页数据采用了异步加载,在爬取网页的时候部分数据还没加载进来。

而基于scrapy是一个成熟的爬虫框架的考量,我想第一种情况应该不会出现,毕竟爬虫完全可以等页面初始化完成后再进行爬取,但是对于第二种情况却无法预先控制,因为数据加载是异步的。

基于如上考虑,那便直接考虑第二种情况,因此可以通过在浏览器控制台的Network中查看所有发送的请求,查看是否自己所需的数据是被异步加载了。如下图,可以对每一条请求的Response进行查看,手动查看是否返回了自己所需的信息。
在这里插入图片描述
对于我的情况,果不其然,如上图所示,便被我找到了整个异步请求的返回的json格式的数据,其中包含了所有我需要的信息,我甚至不需要再去对网页进行爬取,只需如下图所示,查看该请求的Header,可以看到该异步请求的请求格式,即图中的Request URL
在这里插入图片描述
将获得的Request URL复制到浏览新窗口中打开,可以看到如下图,能够访问到json格式的返回数据,这表明网站并没有对这种请求进行拦截,这也使得我不需要再去从页面上爬取数据了,我只需直接构造相应的URL然后分析返回的json数据即可,大功告成!
在这里插入图片描述

posted @ 2019-12-25 23:42  _吟游诗人  阅读(1904)  评论(0编辑  收藏  举报