Splash 学习笔记
一、介绍
Splash
跟之前我们介绍的 Selenium ( 参考 Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记) 很类似,都可以理解成一个浏览器,提供网页动态渲染(css、javascript、flash 等)服务,并且都支持 HTTP API 与之交互。
但不同点在于:
Splash 更轻量级,但缺点是功能没有Selenium丰富。(所以 Selenium 才称得上是自动化测试框架,Splash更多的算一种网页渲染服务)
Splash 的安装、配置、使用更简单
Splash 支持异步,能提高爬取效率
文档地址:https://splash.readthedocs.io/en/stable/
二、安装
注意:事先安装好 docker。
docker run -p 8050:8050 scrapinghub/splash
部署在远程服务器记得加 -d 参数,它代表将 Docker 容器以守护态运行,这样在断开远程服务器连接后,不会终止 Splash 服务的运行。
三、使用
安装好后,打开 http://localhost:8050
即可访问,页面如下:
本文安装版本为 v3.4。
可以在此 web 页面来使用,也可以用下面介绍的 API 调用方式,更灵活。
三、Splash API 调用
http://localhost:8050/render.html?url=https://www.baidu.com
http://localhost:8050/render.png?url=https://www.baidu.com
http://localhost:8050/render.jpeg?url=https://www.baidu.com
http://localhost:8050/render.har?url=https://www.baidu.com
http://localhost:8050/render.json?url=https://www.baidu.com
除了上面指定的最简单的url、render类型,还可以通过 Lua 脚本执行更复杂的渲染操作和交互逻辑(即用 execute)。
我们用 python 代码为例:
import requests
from urllib.parse import quote
lua = """
function main(splash)
return 'hello'
end
"""
url = 'http://localhost:8050/execute?lua_source=' + quote(lua)
response = requests.get(url)
print(response.text)
下面我们对 Lua 脚本的写法做更多的介绍。
四、Splash 的 Lua 脚本
1、base demo
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
接下来针对这个最基本的 demo,来展开介绍。
2、main() 函数
main 函数就是 splash 默认要调用的函数,所以这里保持固定写法就好。
而 main 的返回值,既可以是字典形式,也可以是字符串形式,最后都会转化为 HTTP Response。
3、splash 对象
splash 类似于 Selenium 中的 WebDriver 对象。
(1)splash 属性
上面提到的 main 函数的第二个参数 args 其实是 splash 对象的其中一个属性,即:
splash.args = args
splash.resource_timeout = 0.1 - 设置超时时间。如果设置为 0 或 nil (类似 Python 中的None),代表不检测超时。
此属性适合在网页加载速度较慢的情况下设置
splash.js_enabled = false - 是否执行 js(默认为 ture)
splash.images_enabled = false 是否加载图片(默认为 ture)
小心 image 不加载导致个别 DOM 渲染出错
splash.plugins_enabled = false - 是否加载浏览器插件,如 Flash 插件 (默认 false)
splash.scroll_position = {x=100, y=200} = 页面上下或左右滚动
(3)splash 方法
go() - 模拟 GET 和 POST 请求
http_get() - 模拟 GET 请求
http_post() - 模拟 POST 请求
function main(splash, args)
-- 错误处理
local ok, reason = splash:go{"http://httpbin.org/post", http_method="POST", body="name=Germey"}
if ok then
return splash:html()
end
end
wait() - 等待。类似 python 中的 sleep(多与 go 配合,紧接在 go 后面)
为什么 splash 没有 selenium 的 expected_conditions(预期条件判断)方法,如presence_of_element_located。
call_later() - 类似 JavaScript 的 settimeout
evaljs() - 执行 js 代码
local title = splash:evaljs("document.title")
runjs() 跟 evaljs() 功能类似,只不过语义上更倾向于只调用不关心返回值。
autoload() 跟 evaljs() 功能类似,只不过语义上更倾向于预先加载。
jsfunc() - JavaScript 方法转换为 Lua 脚本
这个好,毕竟我 Lua 语法不熟。
function main(splash, args)
local get_div_count = splash:jsfunc([[
function () {
var body = document.body;
var divs = body.getElementsByTagName('div');
return divs.length;
}
]])
splash:go("https://www.baidu.com")
return("There are %s DIVs"):format(get_div_count())
end
url() - 获取/设置 url
html() / set_content() - 获取/设置 html 内容
splash:set_content ("hello")
png() / jpeg() - 获取页面截图
har() - 获取页面加载过程描述
get_cookies() / add_cookie() / clear_ cookies() - 获取/设置/清除 html 内容
splash:add_cookie({"sessionid", "asdasd", "/", domain="http://example.com" })
set_user_agent() - 设置 user-agent
set_custom_headers() - 设置 header
自定义程度更高,可以设置 user_agent、cookies 等等
splash:set_custom_headers({
["User-Agent"] = "Splash",
["Site"] = "Splash",
})
get_viewport_size() / set_viewport_size(width, height) - 获取/设置页面大小
set_viewport_full() - 设置全屏
select() - css 选择器 (选择首个)
input = splash:select("#kw”)
-- 点击控件
input:mouse_click()
-- 给控件输入文本
input:send_text('Splash')
selectAll() - css 选择器 (选择全部)
-- 通过 css 选择器选中了节点的正文内容,随后遍历了所有节点,将其中的文本获取下来
local texts = splash:select_all('.quote .text')
local results = {}
for index, text in ipairs(texts) do
results[index] = text.node.innerHTML
end
五、Splash 负载均衡配置
待写。具体可看原书。
六、参考资料
《Python 3网络爬虫开发实战》
Splash 学习笔记的更多相关文章
- GRUB学习笔记(转自http://www.cnblogs.com/evilzy/archive/2008/03/30/1130173.html)
grub学习笔记1 首先要了解的几个概念 1.1 启动管理器 启动管理器是存储在磁盘开始扇区中的一段程序,例如,硬盘的MBR(Master Boot Record),在系统完成启动测试后,如果系统是从 ...
- Python学习笔记(六)
Python学习笔记(六) Ubuntu重置root密码 Ubuntu 16.4 目录结构 Ubuntu 命令讲解 1. Ubuntu重置root密码 启动系统,显示GRUB选择菜单(如果默认系统启动 ...
- 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除
目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
随机推荐
- 【Flask系列】开发一个简单的Flask程序
知识点 初始化:每一个flask程序都必须创建一个程序实例,遵循WSGI(Web Server Gateway interface)协议,把请求->flask Obj; 创建实例: app = ...
- mac安装numpy,scipy,matplotlib
SaintKings-Mac-mini:~ saintking$ python Python ( , ::) [GCC Compatible Apple LLVM (clang-)] on dar ...
- Logos讲解--逆向开发
前言 Logos是CydiaSubstruct框架中提供的一组宏定义.利于开发者使用宏进行Hook操作,其语法简单,功能是非常强大且稳定. 详细内容logos语法为http://iphonedevwi ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- 一条数据的HBase之旅,简明HBase入门教程3:适用场景
[摘要] 这篇文章继HBase数据模型之后,介绍HBase的适用场景,以及与一些关键场景有关的周边技术生态,最后给出了本文的示例数据 华为云上的NoSQL数据库服务CloudTable,基于Apach ...
- LeetCode刷题--无重复字符的最长子串(中等)
题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...
- 上手spring boot项目(一)之如何在controller类中返回到页面
题记:在学习了springboot和thymeleaf之后,想完成一个项目练练手,于是使用springboot+mybatis和thymeleaf完成一个博客系统,在完成的过程中出现的一些问题,将这些 ...
- python3如何随机生成大数据存储到指定excel文档里
本次主要采用的是python3的第三方库xlwt,来创建一个excel文件.具体步骤如下: 1.确认存储位置,文件命名跟随时间格式 2.封装写入格式 3.实现随机数列生成 4.定位行和列把随机数写入 ...
- acm博弈论基础总结
acm博弈论基础总结 常见博弈结论 Nim 问题:共有N堆石子,编号1..n,第i堆中有个a[i]个石子. 每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一 ...
- 最短路 & 差分约束 总结
一.引例 1.一类不等式组的解 二.最短路 1.Dijkstra 2.图的存储 3.链式前向星 4.Dijkstra + 优先队列 ...