场景运用碰到了 购买的代理IP无法使用的情况下,自己进行IP搭建以实现IP的可用性;
IP 池的搭建方法还是很多的,但是质量高一些的方案都离不开自己购买服务器搭建服务,这篇文章给大家分享一次 VPS 的IP池搭建;
一、 VPS 配置
第一步、购买服务器完成后链接上 vps 一定要先拨号
pppoe-start
第二步、安装 软件 squid
yum install squid -y
第三步、找到配置文件进行修改
vi /etc/squid/squid.conf
全局搜索 http_access deny all 找到 它所在行,再他的上一行添加:
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
acl auth_user proxy_auth REQUIRED
http_access allow auth_user
默认的端口号 3128 也是可以修改的
http_port 3128
文章的底部 添加 高匿代理的配置
request_header_access X-Forwarded-For deny all
request_header_access From deny all
request_header_access Via deny all
修改完成后如图:
第四步、安装 htpasswd
yum -y install httpd-tools
之后就是配置账号密码以及重启 squid
htpasswd -c /etc/squid/passwd 代理IP用户名
service squid restart
systemctl enable squid # 设置为 开机自启
/sbin/ifdown ppp0;/sbin/ifup ppp0;ifconfig # IP 重新拨号
上述就是配置 单台vps 的完整 流程
二、多IP 提取交互
搭建一台的 VPS 明显是不够正常使用的,这个时候就需要 另外一台固定IP的 服务器或者redis 作为 中转调用,这个就看个人习惯了,可以是 flask api 提取调用,也可以是 redis 自己选择使用。
redis 方案:
自动切换 IP
# coding=utf-8
ADSL_BASH = '/sbin/ifdown ppp0;/sbin/ifup ppp0'
ADSL_IFNAME = 'ppp0'
import re
import time
import datetime
from redis import StrictRedis
import subprocess
redis_host = '自己的 redis IP'
redis_port = 6379
redis_password = '自己的 redis 密码'
redis = StrictRedis(host=redis_host, password=redis_password, port=redis_port, db=0)
ADSL_CYCLE = redis.get('ADSL_CYCLE')
if ADSL_CYCLE is None:
ADSL_CYCLE = 60
else:
ADSL_CYCLE = int(ADSL_CYCLE)
class Sender:
def get_ip(self, ifname=ADSL_IFNAME):
"""
获取本机IP
:param ifname: 网卡名称
:return:
"""
(status, output) = subprocess.getstatusoutput('ifconfig')
if status == 0:
pattern = re.compile(ifname + '.*?inet.*?(\d+\.\d+\.\d+\.\d+).*?netmask', re.S)
result = re.search(pattern, output)
if result:
ip = result.group(1)
return ip
else:
pass
def set_proxy(self, proxy):
"""
设置代理
:param proxy: 代理
:return: None
"""
redis_cli_ip = StrictRedis(host=redis_host, password=redis_password, port=redis_port, db=15)
redis_cli_ip.set(proxy, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ex=ADSL_CYCLE - 5)
redis_cli_ip.close()
def adsl(self):
"""
拨号主进程
:return: None
"""
ADSL_ERROR_CYCLE = 5
PROXY_PORT = 3128
while True:
print('ADSL Start, Please wait')
(status, output) = subprocess.getstatusoutput(ADSL_BASH)
if status == 0:
print('ADSL Successfully')
ip = self.get_ip()
if ip:
proxy = '{ip}:{port}'.format(ip=ip, port=PROXY_PORT)
print('Now proxy:%s' % proxy)
self.set_proxy(proxy)
print('Sleeping')
time.sleep(ADSL_CYCLE)
else:
print('Get IP Failed, Re Dialing')
time.sleep(ADSL_ERROR_CYCLE)
else:
print('ADSL Failed, Please Check')
time.sleep(ADSL_ERROR_CYCLE)
if __name__ == '__main__':
sender = Sender()
sender.adsl()
成功实例:
调用 IP
使用只需要把存活的IP 提取出来即可
from redis import StrictRedis
redis_host = ''
redis_port = 6379
redis_password = ''
redis = StrictRedis(host=redis_host, password=redis_password, port=redis_port, db=15)
print(redis.keys())
至于 flak 方案也是 类似的 只需要 设置一个字典映射即可完成
以上便是 IP 池搭建的其中一种方案,大家可以作为 参考,还有一种方案是将自己的 后台服务器 或者手机 当作 代理IP 使用,这个方法 等下一篇文章再进行分享