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

 更新时间:2020年07月10日 14:10:16   作者:爱喝马黛茶的安东尼  
在本篇文章里小编给大家分享了关于Python3爬虫里关于Splash负载均衡配置的相关内容,需要的朋友们可以学习参考下。

用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如何发布程序的详细教程

    Python是一种面向对象的解释型计算机程序设计语言,现在很多人都在使用,尤其是其跨平台特性及自然语言属性,获得很多人的钟情,那么如何把Python程序打包为Windows系统中的exe可执行程序呢
    2018-10-10
  • python+splinter实现12306网站刷票并自动购票流程

    python+splinter实现12306网站刷票并自动购票流程

    这篇文章主要为大家详细介绍了python+splinter实现12306网站刷票并自动购票流程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • python实现简单名片管理系统

    python实现简单名片管理系统

    这篇文章主要为大家详细介绍了python实现简单名片管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • python pandas dataframe 行列选择,切片操作方法

    python pandas dataframe 行列选择,切片操作方法

    下面小编就为大家分享一篇python pandas dataframe 行列选择,切片操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python使用opencv实现马赛克效果示例

    python使用opencv实现马赛克效果示例

    这篇文章主要介绍了python使用opencv实现马赛克效果,结合实例形式分析了Python使用cv2模块操作图片实现马赛克效果的相关技巧,需要的朋友可以参考下
    2019-09-09
  • python中判断类型函数isinstance()示例详解

    python中判断类型函数isinstance()示例详解

    isinstance()函数是Python的内置函数,用于判断一个变量是否是某个类型或者是该类型的子类的实例,在Python中,所有类都继承自object,所以任何实例都会是object的实例,本文给大家介绍python中判断类型函数isinstance(),感兴趣的朋友一起看看吧
    2024-10-10
  • 极简Python库CherryPy构建高性能Web应用实例探索

    极简Python库CherryPy构建高性能Web应用实例探索

    今天为大家介绍的是 CherryPy,它是一个极简、稳定且功能强大的Web框架,可以帮助开发者快速构建高性能的 Web 应用程序,使用 CherryPy,你可以轻松地创建RESTful API、静态网站、异步任务和 WebSocket 等应用
    2024-01-01
  • Python实现读取HTML表格 pd.read_html()

    Python实现读取HTML表格 pd.read_html()

    这篇文章主要介绍了Python实现读取HTML表格 pd.read_html(),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python 如何限制输出日志的大小

    Python 如何限制输出日志的大小

    这篇文章主要介绍了Python 限制输出日志的大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python机器学习多层感知机原理解析

    Python机器学习多层感知机原理解析

    最简单的深度网络称为多层感知机,它们由多层神经元组成,每一层都与下面一层(从中接收输入)和上面一层(反过来影响当前层的神经元)完全相连
    2021-10-10

最新评论