拨号上网是常见的一种联网方式,常见于家庭上网。通常此方式下,IP地址是不固定的,每次联网时由运营商随机分配。利用此原理,重复断网联网操作,可获得大量不同的IP
背景前些时候搭建了一套爬虫系统,对某站点进行数据抓取测试,该网站对同一IP访问频率有限制,需要使用代理IP来解决。目前市面上的免费代理IP质量都很差,几乎无法正常使用,而优质一些的付费动态IP,价格也愈来愈高。由于本人并非是出于商业目的,为节约成本,遂采购了最便宜的动态拨号vps,自行搭建代理服务
准备1. 动态拨号VPS一台,要求可以对外开放端口,我使用的是云立方VPS,CentOS7系统,这里声明一下并非是给它打广告,我也使用过芝麻代理等其他服务商的VPS,要么价格不合理、要么无法开放指定端口,目前只知道这一家可以满足需求。朋友们如果有其他合适的推荐,欢迎留言推荐下
2. Web服务器一台,用于管理代理IP、提供接口服务,需要有固定IP可以公网访问,购买最便宜的就可以了,建议安装Linux系统。
部署简单说下整体架构
1. 在VPS上设定计划任务,每隔一段时间进行拨号,将获得的新IP保存到Web服务器。
2. 在VPS上搭建代理服务,作为代理服务器转发爬虫请求
3. 爬虫系统通过请求Web服务器的接口,获取到代理服务器信息,以便隐藏本机地址。
VPS每次断网后重新拨号连接,都会获得一个新IP地址,这实际上是运营商有一个庞大的IP池,在每次联网的时候,便分配给一个空闲的IP。
基于上述特点,可以采用定时重新拨号的方式,源源不断获取一个新的IP。我猜测目前市面上销售的动态IP,应该用的也是这种方式。拨号VPS便可以实现该功能,但在拨号期间,网络会断开几秒,如果不能容忍,可以采购多台VPS,错开拨号时间
开通VPS
依次按以下步骤,开通并登录到VPS主机
账户充值一定金额,云立方需要先充值,再购买; 购买最低配置的拨号vps即可,安装Centos系统,其他Linux系统应该也可以; 在VPS管理,对应主机的控制面板页面,找到主机远程IP端口信息,用于远程登录,该地址 信息不会因为拨号而变化; 使用你喜欢的工具,登录主机部署环境。ADSL拨号上网
通常动态拨号VPS已经写好拨号、断网脚本了,不同厂商主机命令可能稍有不同
· 拨号联网
$ adsl-start· 断开联网
$ adsl-stop· 查看网络信息
$ ifconfig重复执行拨号、断开、拨号操作,可以看到网卡ppp0的ip地址发生变化。执行完命令,可以使用ping http://baidu.com 的方式,查看对外网络情况。
TinyproxyVPS开通之后,需要搭建一个代理服务。TinyProxy是一款优秀的代理软件,虽然比较小众,没有Squid功能丰富,但是小巧简单,足以满足普通用户的需求
安装
Centos系统下,安装命令
$ yum install epel-release$ yum install -y tinyproxy配置
tinyproxy配置文件位于/etc/tinyproxy/tinyproxy.conf ,主要修改监听端口、代理header、访问权限等配置。打开该文件,修改以下部
# 代理服务端口Port 1888ErrorFile 403 "/usr/share/tinyproxy/403.html"MaxClients 200DisableViaHeader Yes# 授权哪些ip,可以使用该代理 ,这里应该是授权给爬虫服务器Allow 127.0.0.1Allow 117.8.8.8# ...服务管理
· 启动服务
$ systemctl start tinyproxy· 停止服务
$ systemctl stop tinyproxy· 测试
$ curl http://httpbin.org/ip -x http://127.0.0.1:1888不出意外,可以看到http代理成功, 现在爬虫服务器只要知道该VPS当前IP地址,就可以使用代理服务了
Web服务VPS的IP地址是动态的,爬虫服务器无法直接获得每次变化后的IP,因此需要有个地方可以存储该VPS的当前IP地址。
我这里使用了最简单的办法,搭建了一个Web服务,提供两个对外的API接口。VPS在拨号完成后,访问其中一个API,将VPS地址记录在Web服务器。而爬虫系统则在运行过程中,访问另一个API,获取到代理服务器(VPS)信息。
Web服务器的开通和配置,本文不再赘述。这里我使用了PHP代码来实现,主要代码如下,提供两个方法,保存代理IP和读取代理IP
class Proxy{ private $key='proxy-key'; //保存或删除代理IP public function setIp(){ $key=$_POST['key']; //接口身份验证,防止恶意访问 if($key !=$this->key){ return false; } if($_POST['delete']){ //删除代理信息 //... }else{ $ip =$_SERVER['REMOTE_ADDR']; //代理服务器ip地址 //保存代理信息 //... } return true; } //获取代理IP public function getIp(){ $data=[]; //读取保存的代理信息 //... return $data; }}具体使用何种语言、如何缓存数据,搭建web服务,请根据个人喜好进行编写、部署。
环境部署完成后,需要将两者联系起来,每隔一定时间更换IP,以达到代理池的效果。
流程
假设当前VPS已经连接网络,完整的流程应该是
访问Web接口,删除当前代理信息 VPS断开网络 VPS拨号上网 访问Web接口,保存新的代理IP信息 定时重复1-4操作脚本实现
这个流程,可以使用shell脚本实现
假设Web服务器接口地址为http://webserver.com/api/proxy,在/root/目录下新建proxy.sh文件,内容如下
#!/bin/shcurl -XPOST http://webserver.com/api/proxy --data 'key=proxy-key&delete=1'/usr/sbin/adsl-stop/usr/sbin/adsl-startcurl -XPOST http://webserver.com/api/proxy --data 'key=proxy-key'使用Linux crontab,定时执行该脚本,达到定期更换IP的目的
$ chmod +x proxy.sh$ crontab -e例如每10分钟,更换一次ip,计划任务规则如下
*/10 * * * * /root/proxy.sh使用代理
爬虫系统,在访问目标网址之前,先请求Web服务器getIp()接口,获取当前代理服务器IP地址,端口为tinyproxy配置文件中设置的端口(本文是1888)。
注意事项1. 一方面云立方VPS稳定性较差,经常会出现断网、停机等问题;另一个方面断线重播过程后断网几秒,如果对可用性要求高,可以多对比几家服务商,购买多个地区的VPS,交替拨号;
2. 该方式同一时间一台主机仅能提供一个IP,如果同时需要很多代理IP,从费用方面综合考虑,可能直接购买短时效的大量代理更合适;
3. 注意防火墙和IP白名单规则,可能会导致被滥用或无法正常使用;
4. 很多拨号VPS都无法对外开放自定义端口,这样即便服务搭建成功,也不能对外使用。
本文发布于:2022-09-10 08:40:24,感谢您对本站的认可!
本文链接:https://www.bsyshop.com/ask/xinxi/82/335848.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |