scrapy爬取动态页面的正确姿势

科技一点鑫得 2024-03-27 06:53:37

scrapy无疑是优秀的爬虫框架,它使用的是类似Requests的方式来爬取网页,也就是说它爬取的静态页面,但是现实却是大部分的网站都是动态的,我们看到的正常页面都是浏览器渲染后的结果,如果直接使用scrapy爬取网页很可能得不到期望的数据。一种想当然的方式,就是通过自定义Middleware使用类似selenium这种模拟浏览器行为的方式来直接拿到渲染好的html内容,这样当然是可行的,scrapy也可以轻松和selenium对接,不足之处是增加了资源的消耗。

还有一种直达本质的方式,就是找到数据的源头,有的通过ajax请求获取数据源,有的将数据源放到js代码中,通过浏览器开发工具分析交互过程找到数据源头后,如果是ajax请求就直接请求对应的接口就可以拿到数据,本文将介绍数据源在js文件中的提取方法。

举个例子

这里以某文库搜索结果为例,如果直接scrapy爬取页面是看不到下图中的搜索结果的,分析页面结构发现源头数据在script脚本中,脚本中基本上就是类似json的数据对象,只要拿到js脚本的对象数据就等于得到了搜索结果。

安装chompjs

python是可以解析js脚本并获取其中的数据对象的,这里推荐chompjs这个库,chompjs可以直接将js中的数据对象返回给python,非常的方便,使用前需要使用pip install chompjs安装此库。需要注意的是,chompjs的核心代码使用c来编写,因此安装chompjs需要事先安装c++构建工具。

1. 如果事先没有安装c++构建工具会报错

2. 访问上面错误提示中的链接下载c++构建工具并安装

安装成功之后再次执行pip install chompjs安装成功

scrapy shell

scrapy shell可以使用交互方式快速验证提取数据的代码,不需要一次次地运行爬虫验证,非常的高效,接下来就演示如何使用scrapy shell把js中的数据提取出来。启动scrapy shell

scrapy shell "https://wenku.baidu.com/search?word=python&lm=0&od=0&fr=top_home&ie=utf-8&_wkts_=1711155481643&wkQuery=python"

从返回的结果来看,response已经获取到了爬取的页面内容,接下来主要使用response进行数据提取

我们已经知道数据源在script中,直接使用response.css('script')可以获取所有的script,我们需要的是第二个script中的脚本

直接取出script中的js脚本,response.css("script::text")[1].get()

最后就是导入chompjs库,执行js代码并获取返回的数据对象

import chompjsdata = chompjs.parse_js_object(js_code)

data是dict字典对象,需要的数据在'sulaData'这个key中,至此,大功告成啦。

简单做个总结,我认为使用scrapy写爬虫根本不需要用到像selenium这样的模拟浏览器下载器,解决的办法就是找到数据的源头,没有数据源动态网站也无从渲染。不过,这里忽略了一个重要的环节,就是登录,不同平台登录机制也不同,各种各样的验证码让人头疼,正面硬刚很可能碰的头破血流,因此我不建议把登录部分写在爬虫里,一种更好的方案是单独开发一个cookie池服务,cookie池服务负责管理所有平台的用户登录,不能自动登录的就提供手工登录,并通过web api提供随机获取cookie,scrapy通过调用cookie池的api来获取cookie实现模拟已登录用户状态。

0 阅读:0

科技一点鑫得

简介:感谢大家的关注