输入下面命令运行splash:html
docker run -p 8050:8050 scrapinghub/splash
一个splash的基本实例:python
function main(splash, args) splash:go("http://www.baidu.com") splash:wait(0.5) lcoal title = splash:evaljs("document.title") return {title=title} end
将上面实例复制到 localhost:8050 的代码编辑区域,并将网址设为 http://www.baidu.comnginx
点击Render me!返回 http://www.baidu.com 的titledocker
咱们在这里定义的方法名称为main(),这个名称是固定的,Splash会根据这个名字执行。json
该方法的返回值既能够是字典形式,也能够是字符串形式,最后都会转化为Splash HTTP Response。api
Splash支持异步处理,可是这里没有显式指明回调方法,其回调实在Splash内部完成的。浏览器
示例以下:缓存
function main(splash, args) local example_urls = {"www.baidu.com", "www.taobao.com", "www.zhihu.com"} local urls = args.urls or example_urls local results = {} for index, url in ipairs(urls) do local ok, reason = splash:go("http://" .. url) if ok then splash:wait(2) results[url] = splash:png() end end return results end
上面实例运行结果为,三个网站的的截图。
在脚本内调用的wait()方法相似与sleep()。其参数为等待的秒数。服务器
“..”为拼接字符串。cookie
该属性能够获取加载时配置的参数,好比URL,
若是为GET请求,它还能够获取GET请求参数;
若是为POST请求,它能够获取表单提交的数据。
Splash也支持使用第二个参数直接做为args,例如:
function main(spalsh, args) local url = args.url end
这里第二个参数args就至关于splash.args属性,以上代码等价于:
function main(spalsh) local url = splash.args.url end
这个属性是Splash的JavaScript执行开关,能够将其配置为true或false来控制是否执行JavaScript代码,默认为true.
通常不用设置此属性,默认开启。
顾名思义,此属性设置加载的超时时间,单位为秒。若是设置为0或者nil(相似python中的None),表明不检测超时。
此属性用于加载速度较慢的状况,避免给一直等待,超过期间无响应,直接抛出异常忽略便可。
顾名思义,设置图片是否加载,默认状况加载。禁用以后能够节省网络流量并提升加载速度。
注意,禁用图片加载可能会影响JavaScript渲染。由于禁用图片加载后,它的外层DOM节点的高度会发生变化,进而影响
DOM节点的位置。若JavaScript对图片节点有操做的话,其执行就会有影响。
初次以外Splash使用了缓存,一开始缓存了图片,而后禁用了图片加载。再进行加载图片还会出现,此时重启Splash便可
。
此属性控制浏览器插件(如Flash插件)是否开启。默认false,不开启。
经过设置此属性来控制页面上下或左右滚动。
示例以下:
function main(splash, args) assert(splash:go("https://www.taobao.com")) splash.scroll_position = {y=400} return {png = splash:png()} end
这样咱们能够控制页面向下滚动400像素。
该方法用来请求某个连接,也能够模拟GET和POST请求,同时支持传入请求头、表单等数据,其用法以下:
ok, reason = splash:go{url, baseurl=nil, http_method="GET", body=nil, formdata=nil}
其参数说明以下:
该方法的返回结果是结果ok和缘由reason的组合,若是ok为空,表明网页加载出现了错误,此时reason变量包含了错误的缘由,不然证实页面加载成功。
示例以下:
function main(splash, args) local ok, reason = splash:go{"http://httpbin.org/post", http_method="POST", body="name=Germy"} if ok then return splash:html() end end
此方法能够控制页面等待时间使用方法以下:
ok, reason = splash:wait(time, cancel_on_redirect=false, cancel_on_error=true)
参数说明以下:
返回结果也是ok和reason的组合。
此方法能够直接调用JavaScript定义的方法,可是所调用的方法须要用双中括号包围,这至关于实现了JavaScript方法到Lua脚本的转换。
此方法能够执行JavaScript代码并返回最后一条JavaScript语句的返回结果,使用方法以下:
result = splash:evaljs(js)
此方法能够执行JavaScript代码,它与evaljs()的功能相似,可是更偏向于执行某些动做或声明某些方法。
此方法能够设置每一个页面访问时自动加载的对象,使用发放以下:
ok, reason = splash:autoload{source_or_url, source=nil, url=nil}
参数说明以下:
此方法只负责加载JavaScript代码或库,不执行任何操做。执行操做的话,须要调用evaljs()或runjs()方法。
此方法能够经过设置定时任务和延迟时间来实现任务延时执行,而且能够在执行前经过cancel()方法从新执行定时任务。
示例以下:
function main(splash, args) local snapshots = {} local timer = splash:call_later(function() snapshots["a"] = splash:png() splash:wait(1.0) snapshots["b"] = splash:png() end, 0.2) splash:go("https://www.taobao.com") splash:wait(3.0) return snapshots end
此方法能够模拟发送HTTP的GET请求,使用方法以下:
response = splash:http_get{url, headers=nil, follow_redirects=true}
参数说明以下:
此方法用来模拟发送POST请求,使用方法以下:
response = splash:http_post{url, headers=nil, follow_redirects=true, body=nil}
参数说明以下:
此方法用来设置页面的内容,示例以下:
function main(splash, args) assert(splash:set_content("<html><body><h1>hello</h1></body></html>")) return splash:png() end
此方法用来得到网页的源代码
此方法用来获取PNG格式的网页截图。
此方法用来获取JPEG格式的网页截图。
此方法用来得到页面加载过程描述
此方法能够获取当前正在访问的URL
此方法能够获取当前页面的Cookies。
此方法能够为当前页面添加Cookies。
此方法能够清除全部的Cookies。
此方法能够获取当前浏览器页面的大小。
此方法能够设置当前浏览器页面的大小
此方法能够设置浏览器全屏显示
此方法能够设置浏览器的User-Agent。
此方法能够设置请求头
该方法能够选中符合条件的第一个节点,若是有多个节点符合条件,则只会返回一个,其参数时CSS选择器。
此方法能够选中全部符合条件的节点,其参数是CSS选择器。
此方法能够模拟鼠标点击操做,传入的参数为坐标值的x 和y。此外,也能够直接选中某个节点,而后调用此方法。
与python结合调用。
此接口用于获取JavaScript渲染的页面的HTML代码,接口地址就是Splash的运行地址加此接口名称,
例如 :
http://localhost:8050/render.html?url=https://www.baidu.com
咱们给此接口传递了一个url参数来指定渲染的URL,返回结果即页面渲染后的源代码。
此接口能够获取网页截图,经过width和heigh来控制宽高,返回PNG格式的图片二进制数据。示例以下:
curl http://localhost:8050/rnder.png?url=https://www.taobao.com&wait=5&width=1000&height=700
此接口接口返回jpeg格式的网页截图。参数quality用来设置图片质量。
此接口用于获取页面加载的HAR数据,示例以下:
curl http://localhost:8050/render.har?url=https://www.jd.com&wait=5
此接口包含了前面接口的全部功能,返回结果是JSON格式。
此接口是最为强大的接口,实现了与Lua脚本的对接。
负载均衡的目的就是为了多个服务器分担压力。
假设四台服务器哦IP地址为:
四台服务器的Splash均经过dockers的splash镜像在端口:8050开启服务。
选择任意一台带有公网IP的主机来配置负载均衡。
首先在服务器安装Nginx。
修改Nginx的配置文件nginx.conf,添加以下内容:
http { upstream splash { # 服务器集群名为splash least_conn; # 表明最少连接负载均衡,去掉此行将使用默认的轮询策略实现负载均衡 # 若使用ip_hash,此方法确保同一服务器响应请求,此方法适合有状态的服务。 # Splash不须要应用此设置。 server 127.0.0.1:8050; # 还能够添加weight参数设置权值,权值越高分配到的请求越多。 server 127.0.0.2:8050; server 127.0.0.3:8050; server 127.0.0.4:8050; } server { listen 8050; location / { proxy_pass http://splash; # 设置下面两行来进行用户认真。 auth_basic "Restricted"; auth_baseic_user_file /etc/nginx/conf.d/.htpasswd; } } }
上面用户认证的用户名和密码配置放置在 /etc/nginx/conf.d 目录下,咱们须要使用htpasswd命令建立。
例如,建立一个用户名为admin的文件,相关命令以下:
htpasswd -c .htpasswd admin
以后输入两次密码便可。
配置完成后须要重启Nginx服务。
测试文件在
./test_load_balance.py