如何使用adsl自动拨号实现换代理?(保姆级教程)
由于之前曾受ip代理的成本之苦,那么今天给大家带来adsl自动拨号换代理的保姆级教程。观前须知:此方法的局限性是需要等待拨号后生效的时间(5~10s),首先我们需要了解配置的大概流程:
- 需要一台vps云服务器
- 一个Xshell工具
- python脚本
我们需要的Xshell工具是用来登录远程服务器的centos7系统,实现可视化操作远程服务器。首先,我们需要获取一台云服务器,我们通过Xshell工具配置云服务器的centos7系统,实现可代理性,然后通过python脚本每隔一段时间进行拨号获取新的代理ip。这样就可以获取新的稳定代理ip了。大致流程如下:
一、云服务器
那么我们首先需要获取一台云服务器。这里以云立方的vps云服务器为例,目前一个月110R,那么大家也可以用其他网上其他的云主机,如阿斯云、阳光NET、无极网络,个人实现动态拨号选一些基础配置就够用了,如果是大量爬虫,需要实现一千万级以上的数据爬取,可以选一些配置高一点的。个人推荐后两个,相对实惠一些(70-88/月),当然也可以选一些稳定性强一些的代理商像云立方,但是就是贵些(110/月)。
这里我选择配置的云主机是centos7的操作系统,购买时尽量选用centos7的操作系统,如云立方的会出现一个操作界面,选择Centos7.6 64位即可,如下:
我们以云立方的山东威海电信为例,购买成功后可以在后台找到服务器的连接IP、端口、用户名、密码以及拨号后所用的用户名和密码,具体如下所示:
使用我们本机的远程桌面连接登录云服务器,输入ip:端口即可。
连接成功后输入登录密码,进到桌面连接网络。都没有问题后,点击预装操作系统,20分钟后使用Xshe工具连接云服务器。
二、Xshell7配置云服务器代理环境
(一)Xshell的安装
这里我们就需要用到Xshell工具,进行可视化远程配置云服务器。
Xshell 7工具:链接:https://pan.baidu.com/s/10wMy5U_17_9GN5ZCBIIFNA
提取码:an0x
具体安装教程这里就不再多说了大家可以参考:(19条消息) Xshell 7下载、安装步骤与使用教程_xshell7_Dreamlane的博客-CSDN博客
(二)设置代理服务器
1、配置Squid
登录进去之后,首先我们需要安装Squid,在CentOS系统上安装Squid的命令如下:
- sudo yum -y update
- yum -y install squid
运行完这两行命令后,Squid就安装成功了(更新yum的时间大概在20分钟左右)。
如果想启动Squid,可以运行如下命令:
- systemctl start squid
如果想配置开机自动启动,可以运行如下命令:
- systemctl enable squid
启动Squid成功后,可以使用如下命令查看它当前的运行状态:
- systemctl status squid
结果如图所示,可以看到Squid已经成功运行了。
2、配置代理环境
成功启动Squid后,Squid默认会运行在3128端口,相当于在云主机的3128端口启动了代理服务。接下来我们测试一下Squid的代理效果,在该云主机上运行curl命令,请求https://www.httpbin.org,并使用在云主机上配置的代理服务:
- curl -x http://127.0.0.1:3128 https://www.httpbin.org/get
这里curl的-x参数代表设置HTTP代理,由于现在是在云主机上运行,所以直接将代理设置为了http://127.0.0.1:3128。运行完毕之后,再用ifconfig命令查看当前云主机的IP,结果如图所示:
在ifconfig中我们只需要观察到flags=4305的ip。可以看到origin字段里的IP和用ifconfig获取的IP是一致的。
接下来,我们需要再自己的本机上(非云主机)运行如下命令测试代理的连通情况,这里的IP就需要更换为云主机本身的IP了,由于当前拨号的IP是140.250.112.106,所以运行命令如下:
- curl -x http://140.250.112.106:3128 https://www.httpbin.org/get
然而并没有输出对应的结果,代理连接失败。其实失败的原因在于Squid默认不开启“允许外网访问”,对此我们可以修改Squid的相关配置,例如修改当前的运行端口、允许连接的IP,配置高匿代理等,这些都需要用到配置文件/etc/squid/squid.conf。接下来我们需要设置完整的代理环境,总共七步骤,其中环境配置的步骤是(2)~(5)具体如下:
(1)进入配置文件squid.conf的命令。
- vi /etc/squid/squid.conf
(2)开启“允许公网访问”。
在配置文件中的这行:
- http_access deny all
修改为:
- http_access allow all
意思是允许来自所有的IP的请求连接本代理。
(3)添加acl
在配置文件开头部分添加:
- acl all src 0.0.0.0/0
(4)设置高匿名代理
在配置文件中添加如下内容:
- request_header_access Via deny all
- request_header_access X-Forwarded-For deny all
这样目标网站就无法通过一些参数(如:X-Forwarder-For)得知爬虫机本身的IP了。
(5)更换默认端口
修改文件配置中的这行:
- http_port 3128
修改为:
- http_port 3628
由于有些云主机厂商默认封禁了Squid代理所在的3128端口,因此建议换一个端口,例如3628、3368。
(6)退出配置文件squid.conf的命令。
在vi 命令文件中按ESC键,然后直接按下:冒号,输入退出指令:wq即可。这里的wq的意思是保存文件并退出vi。当然也有其他指令,如下:
- w! 强制保存,不退出vi
- wq 保存文件并退出vi
- wq! 强制保存文件,并退出vi
- q: 不保存文件,退出vi
- q! 不保存文件,强制退出vi
- e! 放弃所有修改,从上次保存文件开始再编辑
- w 保存文件但不退出vi
(7)重启Squid代理
输入重启Squid命令。
- systemctl restart squid
此时重新在本机上(非云主机)运行刚才的curl命令(将端口修改为3628):
- curl -x http://140.250.112.106:3628 https://www.httpbin.org/get
返回结果如下:
出现origin字段的ip,这样就配置成功了,现在就可以在本机上直接使用云主机的代理了。
三、python脚本
通过python脚本自动拨号,获取新的代理ip。
云立方的拨号方式是:
- adsl-stop; 停止拨号
- adsl-start; 开始拨号
其他平台大部分是:
- pppoe-start 拨号
- pppoe-stop 断开拨号
- pppoe-status 拨号连接状态
1、模块
首先我们来看一下我们所需要的模块
- import time
- import paramiko
- import re
- import requests
其中核心模块是 paramiko,下载模块:pip install paramiko。下载过慢,换源即可。
2、连接远程服务器
# 远程服务器的信息
server_ip = 'whdx001.yunpptp.cn'
server_port = 23656
server_username = 'root'
server_password = '*******'
# 使用paramiko连接到远程服务器
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(server_ip, port=server_port, username=server_username, password=server_password)
3、执行拨号命令
- 云立方的拨号命令为adsl-stop;adsl-start,不同平台拨号的命令不同。
- 发送执行云主机访问https://www.httpbin.org/get获取origin字段
- 执行命令有三种,但亲测只有第三种可以获取,如其他方式也可以获取,评论交流,互相学习。
# 执行拨号命令
stdin, stdout, stderr = ssh.exec_command('adsl-stop;adsl-start')
# 获取服务器的公共IP地址
# 获取ip的命令:
# 1、curl ifconfig.me
# 2、wget -qO- http://ipecho.net/plain; echo
# 3、curl -x http://127.0.0.1:3328 https://www.httpbin.org/get
stdin, stdout, stderr = ssh.exec_command('curl -x http://127.0.0.1:3628 https://www.httpbin.org/get')
4、读取内容
- 发送获取origin字段的命令后,睡眠10s,新的ip生效需要5~10s左右
- 通过正则提取字节内容的ip值。
- 这里我为什么要用re获取ip值而不是将字节转化为字符串或者通过json.loads转化为字典,这是因为其字节无法通过.decode("utf-8")进行转码。
time.sleep(10)
result = stdout.read()
print(result)
new_ip = re.findall(r'"origin": "(.*?)",',str(result))
public_ip = new_ip[0]
# 关闭SSH连接
ssh.close()
print(f"The server's public IP address is: {public_ip}")
5、测试新的代理ip
- 这里同样用https://www.httpbin.org网站进行代理测试
proxy = f'{public_ip}:3628'
proxies = {
'http': 'http://' + proxy,
'https': 'http://' + proxy,
}
response=requests.get('https://www.httpbin.org/ip',proxies=proxies,timeout=5)
print(response.text)
print(response.status_code)
整体运行结果如下:
可以看到我们这里成功的实现了自动拨号更换ip,通过测试也是可用代理。
完整代码如下:
# 命令:本机命令远程云服务器执行拨号
import time
import paramiko
import re
import requests
# 远程服务器的信息
server_ip = 'whdx001.yunpptp.cn'
server_port = 23656
server_username = 'root'
server_password = '*******'
# 使用paramiko连接到远程服务器
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(server_ip, port=server_port, username=server_username, password=server_password)
# 执行拨号命令
stdin, stdout, stderr = ssh.exec_command('adsl-stop;adsl-start')
# 获取服务器的公共IP地址 获取ip的命令:1、curl ifconfig.me
# 2、wget -qO- http://ipecho.net/plain; echo
# 3、curl -x http://127.0.0.1:3628 https://www.httpbin.org/get
stdin, stdout, stderr = ssh.exec_command('curl -x http://127.0.0.1:3628 https://www.httpbin.org/get')
time.sleep(10)
result = stdout.read()
print(result)
new_ip = re.findall(r'"origin": "(.*?)",',str(result))
public_ip = new_ip[0]
# 关闭SSH连接
ssh.close()
print(f"The server's public IP address is: {public_ip}")
proxy = f'{public_ip}:3628'
proxies = {
'http': 'http://' + proxy,
'https': 'http://' + proxy,
}
response=requests.get('https://www.httpbin.org/ip',proxies=proxies,timeout=5)
print(response.text)
print(response.status_code)
这样通过vps云服务器代理,实现了adsl自动拨号更换ip就完成了。当然也有其局限性,就是时间间隔要慢很多,在轻量级爬虫中利用还行,如果实现千万级爬虫程序中肯定是不够用的,那么也可以根据此方法通过购买多台云服务器,存储到reids数据库或本地的list中取用,也是可以实现千万级别的爬虫程序的。当然部署的方法和解析自动拨号后的ip的方法也有很多,也可以通过部署域名解析服务器像如花生壳,或其他部署方式来实现第三方自动获取多台ip的服务器,将解析到的ip统一存储到数据库中构建ip代理池,也是可行的。那么也有别的部署方法在这里就不一一介绍了,感兴趣的可以到ADSL动态拨号相关博客自行了解:
- Python 爬虫进阶七之设置 ADSL 拨号服务器代理 | 静觅 (cuiqingcai.com)
- 使用 Tornado+Redis 维护 ADSL 拨号服务器代理池 | 静觅 (cuiqingcai.com)
- socket套接字和dns域名解析
那么关于adsl的部署到这里就结束了,觉得有帮助的话点个赞再走吧😛。