崔庆才python3爬虫 动态渲染页面爬取-Splash负载均衡配置


动态渲染页面爬取-Splash负载均衡配置

1
2
3
用 Splash做页面抓取时,如果爬取的量非常大,任务非常多,用一个Splash服务来处理的话,未
免压力太大了,此时可以考虑搭建一个负载均衡器来把压力分散到各个服务器上。这相当于多台机器
多个服务共同参与任务的处理,可以减小单个Splash服务的压力。

配置Splash服务

1
要搭建Splash负载均衡,首先要有多个Splash服务。假如这里在4 台远程主机的8050端口上都开启了 Splash服务,它们的服务地址分别为 41.159.27.223:8050、41.159.27.221:8050、 41.159.27.9:8050和41.159.117.119:8050,这4个服务完全一致,都是通过Docker的 Splash镜像开启的。访问其中任何一个服务时,都可以使用Splash服务。

配置负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
接下来,可以选用任意一台带有公网IP的主机来配置负载均衡。首先,在这台主机上装好Nginx,然后修改Nginx的配置文件nginx.conf,添加如下内容:
http {
upstrearn splash {
least_conn;
server 41・159.27.223:8050;
server 41.159.27.221:8050;
server 41.159.27.9:8050;
server 41.159.117.119:8050;
}
server{
listen 8050;
location / {
proxy_pass http://splash;
}
}
}
这样我们通过upstream字段定义了一个名字叫作splash的服务集群配置。其中least_conn代表最少链接负载均衡,它适合处理请求处理时间长短不一造成服务器过载的情况。
1
2
3
4
5
6
7
8
当然,我们也可以不指定配置,具体如下:
upstrearn splash {
server 41.159.27.223:8050;
server 41.159.27.221:8050;
server 41.159.27.9:8050;
server 41.159.117.119:8050;
}
这样默认以轮询策略实现负载均衡,每个服务器的压力相同。此策略适合服务器配置相当、无状态且短平快的服务使用。
1
2
3
4
5
6
7
8
另外,我们还可以指定权重,配置如下:
upstream splash {
server 41.159.27.223:8050 weight=4;
server 41.159.27.221:8050 weight=2;
server 41.159.27.9:8050 weight=2;
server 41.159.117.119:8050 weight=l;
}
这里 weight参数指定各个服务的权重,权重越高,分配到处理的请求越多。假如不同的服务器配置差别比较大的话,可以使用此种配置。
1
2
3
4
5
6
7
8
9
最后,还有一种IP散列负载均衡,配置如下:
upstream splash {
ip_hash;
server 42.159.27.223:8050;
server 41.159.27.221:8050;
server 41.159.27.9:8050;
server 41.159.117.119:8050;
}
服务器根据请求客户端的IP地址进行散列计算,确保使用同一个服务器响应请求,这种策略适合有状态的服务,比如用户登录后访问某个页面的情形。对于Splash来说,不需要应用此设置。
1
2
3
我们可以根据不同的情形选用不同的配置,配置完成后重启一下Nginx服务:
sudo nginx -s reload
这样直接访问Nginx所在服务器的8050端口,即可实现负载均衡了。

配置认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
现在Splash是可以公开访问的,如果不想让其公开访问,还可以配置认证,这仍然借助于Nginx。
可以在server的location字段中添加auth_basic和 auth_basic_user_file字段,具体配置如下:

http {
upstream splash {
least_conn;
server 41.159.27.223:8050;
server 41.159.27.221:8050;
server 41.159.27.9:8050;
server 41.159.117.119:8050;
}
server {
liste n 8050;
location / {
proxy_pass h ttp ://s p la sh ;
auth_basic "Restrieted";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
这里使用的用户名和密码配置放置ft/etc/nginx/conf.d目录下,我们需要使用htpasswd命令创建。

例如,创建一个用户名为mdmin的文件,相关命令如下:
htpasswd -c .htpasswd admin
接下来就会提示我们输入密码,输入两次之后,就会生成密码文件,其内容如下:
emt .htpasswd
admin:SZBxQrOrCqwbc

配置完成后,重启一下Nginx服务:
sudo nginx -s reload
这样访问认证就成功配置好了。

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
最后,我们可以用代码来测试一下负载均衡的配置,看看到底是不是每次请求会切换IP。利用http://httpbin.org/get测试即可,实现代码如下:
import requests
from urllib.parse import quote
import re
lua = '''
function main(splash, args)
local treat = require("treat")
local response = splash:http_get("http://httpbin.org/get")
return treat.as_string(response.body)
end
'''
url = 'http://splash:8050/execute?lua_sou:rce=' + quote(lua)
response = requests.get(uil, auth=('admin', 'admin'))
ip = re.search(' (\d+\.\d+\.\d+\.\d+)', response.text).group(1)
print(ip)
1
2
3
4
5
6
7
8
这里URL中的splash字符串请自行替换成自己的Nginx服务器IP。 这里我修改了Hosts, 设置了splash为Nginx服务器IP
多次运行代码之后,可以发现每次请求的IP都会变化,比如第一次的结果:
41.159.27.223
第二次的结果:
41.159.27.9

这就说明负载均衡已经成功实现了。
本节中,我们成功实现了负载均衡的配置。配置负载均衡后,可以多个Splash服务共同合作,减轻单个服务的负载,这还是比较有用的。

本文标题:崔庆才python3爬虫 动态渲染页面爬取-Splash负载均衡配置

文章作者:TTYONG

发布时间:2020年06月07日 - 20:06

最后更新:2022年03月22日 - 09:03

原始链接:http://tianyong.fun/%E5%B4%94%E5%BA%86%E6%89%8Dpython3%E7%88%AC%E8%99%AB-7%E7%AB%A0(7.3)%20%E5%8A%A8%E6%80%81%E6%B8%B2%E6%9F%93%E9%A1%B5%E9%9D%A2%E7%88%AC%E5%8F%96-Splash%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E9%85%8D%E7%BD%AE.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%