Splash 是一个JavaScript渲染服务,是一个带有HTTP API的轻量浏览器,同时它对接了Python中的Twisted和QT库利用它,可以同样实现动态渲染页面的抓取
目录
1、安装
1.1 安装服务和Python库
1.2 使用Splash
2 Splash Lua 脚本 API用法
2.1 入口及返回值
2.2 异步处理
3、Splash 对象属性
3.1 args:获取请求参数
3.2 js_enabled JavaScript执行开关
3.3 resource_timeout 加载时间
3.4 images_enabled 设置图片是否加载
3.5 plugins_enabled 控制浏览器插件开启和关闭
3.6 scroll_position 控制页面的滚动
4、Splash 对象的方法
4.1 go() 用于请求某个链接
4.2 wait() 控制页面的等待时间
4.3 jsfunc() 调用JavaScript定义的方法
4.4 evaljs() 执行并返回最后一条JavaScipt语句的返回结果【静态】
4.5 runjs() 此方法可以执行JavaScript动作或声明的方法【动态】
4.6 autoload() 自动加载对象
4.7 call_later() 设置定时任务或延迟时间
4.8 http_get() 模拟发送HTTP的GET请求
4.9 http_post() 模拟Post请求
5.0 set_content() 设置页面内容
5.1 html() 获取 页的源代码
5.2 png() 获取页面图片
5.3 jpeg() 获取JPEG格式的 页截图
5.4 har() 获取页面加载过程描述
5.5 url() 获取 当前正在访问的URL
5.6 get_cookies() 获取当前页面的Cookies
5.7 add_cookie()
5.8 clear_cookies() 清除Cookies
5.9 get_viewport_size() 获取浏览器页面的大小
6.0 set_viewport_size() 设置当前浏览器
6.1 set_viewport_full() 此方法设置浏览器全屏
6.3 set_user_agent() 设置浏览器的User-Agent
6.4 set_custom_headers() 设置请求头
6.5 select()
6.6 select_all() 选中所有符合条件的节点
6.7 mouse_click() 鼠标操作
3 Splash API调用
3.1 render.html 获取JavaScript渲染的页面的HTML代码
3.2 render.png 获取 页截图
3.3 render.jepg 获取JPEG格式的图片
3.4 render.har
3.5 render.json 此接口包含了前面所有的功能
3.6 execute 与Lua脚本对接
1、安装
Scrapy-Splash 是一个Scrapy中支持JavaScript渲染的工具,安装分为两部分,一个是Splash服务的安装,具体是通过docker,安装之后,会启动一个服务,通过它的接口来实现JavaScript 页面的加载,另外一个是Scrapy-Splash的Python库的安装,安装之后可在Scrapy中使用Splash服务
利用Splash,可以实现以下功能
- 异步方式处理多个 页渲染过程
- 获取渲染后的页面的源代码或截图
- 通过关闭图片渲染或者使用Adblock规则来加快页面渲染速度
- 可执行特定的JavaScript脚本
- 可通过Lua脚本控制页面渲染过程
- 获取渲染的详细过程并通过HAR(HTTP Archive)格式呈现
1.1 安装服务和Python库
访问:http://ip:8050
接下来在安装其Python库
pip install scrapy-splash
1.2 使用Splash
输入框输入https://www.baidu.com
可以看到, 页的返回结果呈现了渲染截图、HAR加载统计数据、 页的源代码。
通过首页可以看到它其实是通过一段代码来展示的:这脚本其实是用Lua语言写的脚本
2 Splash Lua 脚本 API用法
Splash 可以通过Lua脚本执行一系列渲染操作,这样我们就可以用Splash模拟类似Chrome PhantomJS的操作了
2.1 入口及返回值
结果:
通过evaljs() 方法传入JavaScript脚本,而document.title的执行结果就是返回 页标题,执行王弼后将期赋值给一个title变量,随后将其返回
需要注意的是这里定义的方法叫做:main()。这个名称必须是固定的,Splash会默认调用这个方该方法返回值既可以是自定形式,也可以是字符内容形式,最后都会转化为 Splash HTTP Response
字典形式
结果:
返回一个字符串
结果:
2.2 异步处理
Splash 支持异步处理,但是这里并没有显式指明回调的方法,其回调的跳转是在Splash内部完成的
结果运行后3个站点截图
wait() 方法会等待,当Splash执行到次方法时,它会转而去处理其他任务,然后在指定的时间过后再回来继续处理;这里做了加载时异常检测。go() 返回加载页面的结果状态,如果页面出现4xx或5xx状态码。ok变量就会为空,就不会加载后的图片
3、Splash 对象属性
例子中 main(0 方法的第一个参数是 splash ,这个对象非常重要,它类似于Selenium中的 WebDriver 对象,我们可以调用它的 一些属性和方法来控制加载过程
3.1 args:获取请求参数
该属性可以获取加载时配置的参数,比如URL ,如果为GET 请求,它还可以获取GET 请求参数; 如果为 POST 请求,它可以获取表单提交的数据 Splash支持使用第二个参数直接作为args
第二个参数args就相当于splash.args 属性,等价于
3.2 js_enabled JavaScript执行开关
这个属性是 Splas 的JavaScript 执行开关,可以将其配置为 true或 false 来控制是否执行 JavaScript 代码,默认为 true。
evaljs() 方法执行JavaScript代码就会抛出异常;不过一般来说,都是默认打开的
3.3 resource_timeout 加载时间
此属性可以设置加载的超时时间,单位是秒。如果设置为 0或nil (类似 Python中的None ),代 表不检测超时
结果:超出了时间,无响应就 错
3.4 images_enabled 设置图片是否加载
此属性可以设置图片是否加载,默认情况下是加载的。 禁用该属性后,可以节省 络流量并提高 页加载速度 但是需要注意的是,禁用图片加载可能会影响 JavaScript 渲染, 因为禁用图片之后, 它的外层 DOM 节点的高度会受影响,进而影响 DOM 节点的位置 因此,如果 JavaScript 对图片节点 有操作的话,其执行就会受到影响。
另外值得注意的是, Splash 使用了缓存, 如果一开始加载出来了 页图片,然后禁用了图片加载, 再重新加载页面,之前加载好的图片可能还会显示出来,这时直接重启 Splash 即可
结果:
3.5 plugins_enabled 控制浏览器插件开启和关闭
此属性可以控制浏览器插件(如 Flash 插件)是否开启。 默认情况下,此属性是 false ,表示不开 可以使用如下代码控制其开启和关闭:
3.6 scroll_position 控制页面的滚动
通过设置此属性,我们可以控制页面上下或左右滚动 这是一个比较常用的属性
结果:
4、Splash 对象的方法
Splash还是这几种对象方法
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!