Python3爬虫里关于Splash负载均衡配置详解


Posted in Python onJuly 10, 2020

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

1. 配置Splash服务

要搭建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服务。

2. 配置负载均衡

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

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 {
        listen 8050;
        location / {
            proxy_pass http://splash;
        }
    }
}

这样我们通过upstream字段定义了一个名字叫作splash的服务集群配置。其中least_conn代表最少链接负载均衡,它适合处理请求处理时间长短不一造成服务器过载的情况。

当然,我们也可以不指定配置,具体如下:

upstream 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;
}

这样默认以轮询策略实现负载均衡,每个服务器的压力相同。此策略适合服务器配置相当、无状态且短平快的服务使用。

另外,我们还可以指定权重,配置如下:

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=1;
}

这里weight参数指定各个服务的权重,权重越高,分配到处理的请求越多。假如不同的服务器配置差别比较大的话,可以使用此种配置。

最后,还有一种IP散列负载均衡,配置如下:

upstream splash {
    ip_hash;
    server 41.159.27.223:8050;
    server 41.159.27.221:8050;
    server 41.159.27.9:8050;
    server 41.159.117.119:8050;
}

服务器根据请求客户端的IP地址进行散列计算,确保使用同一个服务器响应请求,这种策略适合有状态的服务,比如用户登录后访问某个页面的情形。对于Splash来说,不需要应用此设置。

我们可以根据不同的情形选用不同的配置,配置完成后重启一下Nginx服务:

sudo nginx -s reload

这样直接访问Nginx所在服务器的8050端口,即可实现负载均衡了。

3. 配置认证

现在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 {
        listen 8050;
        location / {
            proxy_pass http://splash;
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
        }
    }
}

这里使用的用户名和密码配置放置在/etc/nginx/conf.d目录下,我们需要使用htpasswd命令创建。例如,创建一个用户名为admin的文件,相关命令如下:

htpasswd -c .htpasswd admin

接下来就会提示我们输入密码,输入两次之后,就会生成密码文件,其内容如下:

cat .htpasswd 
admin:5ZBxQr0rCqwbc

配置完成后,重启一下Nginx服务:

sudo nginx -s reload

这样访问认证就成功配置好了。

4. 测试

最后,我们可以用代码来测试一下负载均衡的配置,看看到底是不是每次请求会切换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_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。

多次运行代码之后,可以发现每次请求的IP都会变化,比如第一次的结果:

41.159.27.223

第二次的结果:

41.159.27.9

这就说明负载均衡已经成功实现了。

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

到此这篇关于Python3爬虫里关于Splash负载均衡配置详解的文章就介绍到这了,更多相关Python3 Splash负载均衡配置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
状态机的概念和在Python下使用状态机的教程
Apr 11 Python
python判断给定的字符串是否是有效日期的方法
May 13 Python
常见python正则用法的简单实例
Jun 21 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
python pyheatmap包绘制热力图
Nov 09 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
Python:slice与indices的用法
Nov 25 Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
Jun 18 Python
python 基于opencv实现高斯平滑
Dec 18 Python
python3爬虫中异步协程的用法
Jul 10 #Python
浅析Python面向对象编程
Jul 10 #Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 #Python
Python 如何对文件目录操作
Jul 10 #Python
Python下划线5种含义代码实例解析
Jul 10 #Python
Python 没有main函数的原因
Jul 10 #Python
如何教少儿学习Python编程
Jul 10 #Python
You might like
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
发布你的Python模块详解
2016/09/15 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
就业自荐信
2013/12/04 职场文书
学校安全责任书范本
2014/07/23 职场文书
个人委托书
2014/07/31 职场文书
学校开除通知书
2015/04/25 职场文书
雷锋观后感
2015/06/10 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript