scrapy分页抓取网页(scrapy成熟的爬虫框架的考量及应用 )
优采云 发布时间: 2021-10-11 16:06scrapy分页抓取网页(scrapy成熟的爬虫框架的考量及应用
)
最近在用scrapy做一个爬虫爬取网站上的一些信息,但是出现了一个很奇怪的问题,就是在网页中打开了要爬取的URL,某个URL位于网页的源代码。需要爬取一些元素,但是我用scrapy爬取数据的时候,发现一个错误,结果是爬取的网页没有收录我在浏览器中看到的元素,也就是for the same URL,抓取的页面和我在浏览器打开看到的页面不一样!
在反复确认CSS类选择器正确以及爬虫爬取的URL没有重定向到其他页面后,发现事情并不简单。
然后机缘巧合下,没有修改任何代码,再次运行,却发现再次爬行成功,然后又试了一次,报错了。这时候就知道,抓取到的页面一定是 完整的页面没有加载完成。
当页面没有完全加载时,我首先想到了两种可能:
首先,部分数据在网页加载时由js动态写入,即部分数据在第一次请求时传递给js,由前端js处理后显示在页面上;
二是网页数据是异步加载的,在抓取网页的时候部分数据还没有加载。
基于scrapy是一个成熟的爬虫框架的考虑,我认为第一种情况应该不会出现。毕竟爬虫可以等到页面初始化好再爬,但是对于第二种情况,因为数据Loading是异步的,所以无法提前控制。
基于以上考虑,直接考虑第二种情况。因此,您可以在浏览器控制台的 Network 中检查所有发送的请求,看看您需要的数据是否被异步加载。如下图所示,可以查看每个请求的Response,手动检查是否返回了你需要的信息。
对于我的情况,果然如上图所示,我找到了整个异步请求返回的json格式数据,里面收录了我需要的所有信息,我什至不需要再抓取网页了,只是作为如下图,查看请求的header,可以看到异步请求的请求格式,也就是图中的Request URL
将获取到的Request URL复制到新的浏览器窗口打开,可以看到下图,可以访问json格式的返回数据,说明网站没有拦截到这种请求,这也使得我没必要去抓取页面的数据了,我只需要直接构造对应的URL,分析返回的json数据,就大功告成了!