scrapy爬取页面不完全的解决办法
最近在使用scrapy来制作爬虫以爬取一些网站上的信息,但是却出现了一个很奇怪的问题,即在网页中打开待爬取的URL,并在网页源代码中定位了某些待爬取的元素,但是当使用scrapy爬取数据时,却发现报错了,而错误竟然是所爬取到的网页中并没有我在浏览器中看到的元素,即对于同一个URL,爬取到的页面和我在浏览器中打开所看到的页面不一样!
在反复确认CSS类选择器没写错,爬虫所爬取的URL没有被重定向到另外的页面后,我发现事情并不简单。
而后我机缘巧合之下在不修改任何代码的情况下重新运行了一遍,却发现又爬取成功了,然后再试一次,又报错了,这时候我就知道,肯定是爬取到的页面是没有加载完全的页面了。
页面没加载完全的情况,我首先想到的有两种可能:
其一,部分数据是在网页加载中由js动态写入的,即在第一次请求中部分数据传给了js并由js在前端进行处理后再显示到页面上;
其二,便是网页数据采用了异步加载,在爬取网页的时候部分数据还没加载进来。
而基于scrapy是一个成熟的爬虫框架的考量,我想第一种情况应该不会出现,毕竟爬虫完全可以等页面初始化完成后再进行爬取,但是对于第二种情况却无法预先控制,因为数据加载是异步的。
基于如上考虑,那便直接考虑第二种情况,因此可以通过在浏览器控制台的Network中查看所有发送的请求,查看是否自己所需的数据是被异步加载了。如下图,可以对每一条请求的Response进行查看,手动查看是否返回了自己所需的信息。
对于我的情况,果不其然,如上图所示,便被我找到了整个异步请求的返回的json格式的数据,其中包含了所有我需要的信息,我甚至不需要再去对网页进行爬取,只需如下图所示,查看该请求的Header,可以看到该异步请求的请求格式,即图中的Request URL
将获得的Request URL复制到浏览新窗口中打开,可以看到如下图,能够访问到json格式的返回数据,这表明网站并没有对这种请求进行拦截,这也使得我不需要再去从页面上爬取数据了,我只需直接构造相应的URL然后分析返回的json数据即可,大功告成!