Scrapy框架(1):splash+Lua 脚本实现滚轮动态加载
一、 前言
1.1 背景
学习爬取 https://ask.csdn.net 的时候发现,CSDN 数据加载通过鼠标下滑实现(动态加载)
1.2 技术对比
对于动态js 页面的爬取有以下几种爬取的方式:
-
通过selenium + phantomjs 实现
-
phantomjs 是一个无头浏览器,selenium 是一个自动化测试的框架,通过无头浏览器请求页面,等待js 加载,再通过自动化测试selenium 获取数据。因为无头浏览器非常消耗资源,所在性能方面有所欠缺。
-
采用Scrapy-splash 框架:
-
Splash作为js渲染服务,是基于Twisted和QT开发的轻量浏览器引擎,并且提供直接的http api。快速、轻量的特点使其容易进行分布式开发。
-
splash 和scrapy 爬虫框架融合,两种互相兼容彼此的特点,抓取效率较好
二、Splash环境搭建
2.1 docker安装(windows 10)
-
windows 10专业版或其他操作系统,安装 docker 比较简单 专业版安装教程
-
在windows 10家庭版安装 docker 需要借助 toolbox(最新)工具安装 家庭版安装教程
2.2 splash 安装
docker pull scrapinghub/splash
2.3 启动 Splash 服务
docker run -p 8050:8050 scrapinghub/splash
2.31 打开浏览器,输入 http://localhost:8050,进入下图极为成功。
2.3.2 在黑色代码块区域上方输入 https://ask.csdn.net/ ,点击 Render me!
2.3.3 点击上图,Script 按钮可看到原始脚本
function main(splash, args)
assert(splash:go(args.url))
assert(splash:wait(0.5))
return {
html = splash:html(),
png = splash:png(),
har = splash:har(),
}
end
注解:
2.3.4 将上图中的 HTML 代码复制到 Sublime Text, Ctrl+f 调出查询框。输入questions_detail_con (csdn 问答模块的数据div 类名),左下角显示20条数据
直接在浏览器中查询 questions_detail_con同样的效果
2.3.5 点击Script 更该脚本,点击Render (这里为了跟好的显示效果返回html 代码,自己根据情况返回相应格式)
function main(splash, args)
splash:go(args.url)
local scroll_to = splash:jsfunc("window.scrollTo")
scroll_to(0, 2800)
splash:set_viewport_full()
splash:wait(5)
return {
html=splash:html()
}
end
2.3.6 重复 2.3.4 步骤,得出返回30条数据(csdn 初始为20条,一次下滑增加10条数据)
2.4 安装python的 scrapy-splash 包
pip install scrapy-splash
三、 Scrapy 爬虫项目教程
经过测试,发现此方法参考资源少,而且采集数据的效果几乎没有用(就不贴代码误人子弟了)。
时间紧迫,决定开辟第二种方法:解析 Ajax + js 动态请求。
3.1参考教程:
Scrapy框架学习(七)----Scrapy与scrapy-splash框架结合,快速加载js页面 Scrapy学习篇(十三)之scrapy-splash 使用scrapy+splash+Lua脚本实现滚轮动态加载爬取CSDN
四、 总结
-
scrapy-splash 目前只能模拟滑动一次,即加载30条数据。(希望大神指导)
- 分析网页源码中
Ajax 的请求,发现了第二中方法。参考教程Scrapy框架(2): CSDN 上滑(动态)加载
|
请发表评论