美文网首页程序员互联网科技Python学习分享
基于PYTHON的SPLASH基本使用和负载均衡配置

基于PYTHON的SPLASH基本使用和负载均衡配置

作者: 烟雨丿丶蓝 | 来源:发表于2019-03-03 21:02 被阅读3次

1. 工具

语言:python3.7,Lua

编译器:pycharm

包管理工具:pip

工具:Scrapy-Splash

应用容器引擎:docker

2. 功能介绍

利用Splash,我们可以实现如下功能:

异步方式处理多个网页渲染过程;

获取渲染后的页面的源代码或截图;

通过关闭图片渲染或者使用Adblock规则来加快页面渲染速度;

可执行特定的JavaScript脚本;

可通过Lua脚本来控制页面渲染过程;

获取渲染的详细过程并通过HAR(HTTP Archive)格式呈现。

3. 项目实战

首先,在本机端口运行Splash服务,打开http://localhost:8050/

image

在输入框内输入https://www.shou.edu.cn/,然后点击Render me

image image

可以看到,网页的返回结果呈现了渲染截图、HAR加载统计数据、网页的源代码。

通过HAR的结果可以看到,Splash执行了整个网页的渲染过程,包括CSS、JavaScript的加载等过程,呈现的页面和我们在浏览器中得到的结果完全一致。

4. Splash Lua脚本

Splash是通过Lua脚本来控制了页面的加载过程的,然后执行一系列渲染操作。

入口及返回值

function main(splash, args)
 splash:go("https://www.shou.edu.cn/")
 splash:wait(1)
 local title = splash:evaljs("document.title")
 return {title=title}
end 

本代码通过evaljs()方法传入JavaScript脚本,而document.title的执行结果就是返回网页标题,执行完毕后将其赋值给一个title变量,随后将其返回。

异步处理

function main(splash, args)
 local example_urls = {"https://www.shou.edu.cn/", "http://www.gdou.edu.cn/", "http://www.ouc.edu.cn/"}
 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()方法类似于Python中的sleep(),其参数为等待的秒数。当Splash执行到此方法时,它会转而去处理其他任务,然后在指定的时间过后再回来继续处理。

5. Splash对象属性

args

该属性可以获取加载时配置的参数,比如URL,如果为GET请求,它还可以获取GET请求参数;如果为POST请求,它可以获取表单提交的数据。

function main(splash, args)
 local url = args.url
end 

第二个参数args就相当于splash.args属性

js_enabled

这个属性是Splash的JavaScript执行开关,可以将其配置为true或false来控制是否执行JavaScript代码,默认为true。

function main(splash, args)
 splash:go("https://www.shou.edu.cn/")
 splash.js_enabled = false
 local title = splash:evaljs("document.title")
 return {title=title}
end

更多对象如resource_timeout、images_enabled、plugins_enabled、scroll_position详见https://blog.csdn.net/weixin_38239050/article/details/82584613

6. Splash对象的方法

详见https://splash.readthedocs.io/en/stable/scripting-ref.html

7. Splash API调用

详见https://splash.readthedocs.io/en/stable/scripting-element-object.html

8. 配置Splash服务

要搭建Splash负载均衡,首先要有多个Splash服务。假如多台远程主机的都开启了Splash服务,它这几个服务必须完全一致,都是通过Docker的Splash镜像开启的。访问其中任何一个服务时,都可以使用Splash服务。

9. 配置负载均衡

选用任意一台带有公网IP的主机来配置负载均衡。首先,在这台主机上装好Nginx,然后修改Nginx的配置文件nginx.conf,添加各台主机的ip。

10. 配置认证

现在Splash是可以公开访问的,如果不想让其公开访问,还可以配置认证,这仍然借助于Nginx。可以在server的location字段中添加auth_basic和auth_basic_user_file字段。

http {
 upstream splash {
 least_conn;
 server xxx;
 server xxx;
 ……
 }
 server {
 listen 8050;
 location / {
 proxy_pass http://splash;
 auth_basic "Restricted";
 auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
 }
 }
}

11. 测试

import requests
from urllib.parse import quote
import re

lua = '''
function main(splash, args)
 local treat = require("treat")
 local response = splash:http_get("https://www.shou.edu.cn/")
 return treat.as_string(response.body)
end
'''

url = 'http://splash:8050/execute?lua_source=' + quote(lua)
response = requests.get(url, auth=('admin', 'admin'))
ip = re.search('(\d+\.\d+\.\d+\.\d+)', response.text).group(1)
print(ip)

这里URL中的splash字符串请自行替换成自己的Nginx服务器IP。这里我修改了Hosts,设置了splash为Nginx服务器IP。

欢迎大家加入小编创建的Python行业交流群,有大牛答疑,有资源共享,有企业招人!是一个非常不错的交流基地!群号:556370268

image

相关文章

  • 基于PYTHON的SPLASH基本使用和负载均衡配置

    1. 工具 语言:python3.7,Lua 编译器:pycharm 包管理工具:pip 工具:Scrapy-Sp...

  • SpringBoot接入CAS的问题解决

    项目背景 前后端分离 负载均衡 gateway转发 使用 基于springboot 基本的接入 配置信息 接入中遇...

  • nginx配置文件详解

    以上是一些基本的配置,使用Nginx最大的好处就是负载均衡 如果要使用负载均衡的话,可以修改配置http节点如下:...

  • Nginx配置文件详细说明

    以上是一些基本的配置,使用Nginx最大的好处就是负载均衡 如果要使用负载均衡的话,可以修改配置http节点如下:...

  • [转]nginx配置文件中文说明-简单

    以上是一些基本的配置,使用Nginx最大的好处就是负载均衡如果要使用负载均衡的话,可以修改配置http节点如下:

  • Docker Swarm 服务发现和负载均衡原理

    本文将介绍基于 DNS 的负载均衡、基于 VIP 的负载均衡和路由网格(Routing Mesh)。 使用的技术 ...

  • Nginx负载均衡配置

    基于轮询(Round Robin)的负载均衡配置 Nginx的负载均衡策略默认就是轮询。 Nginx负载均衡策略支...

  • Nginx负载均衡和双主热备

    CORS配置 防盗链配置 集群负载均衡 四层负载均衡是基于IP+端口的负载均衡,负载转发,记录连接由哪个服务器处理...

  • nginx 的 HTTP 负载均衡

    编译自:load_balancing 目录: 负载均衡方法 默认负载均衡配置 基于最小连接数的负载均衡 会话保持 ...

  • Nginx-负载均衡

    章节目录 什么是负载均衡 使用负载均衡要解决的问题 基于LVS的中间件架构GSLBSLB四层负载均衡和七层负载均衡...

网友评论

    本文标题:基于PYTHON的SPLASH基本使用和负载均衡配置

    本文链接:https://www.haomeiwen.com/subject/htnmuqtx.html