乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
如何使用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动态拨号相关博客自行了解:

  那么关于adsl的部署到这里就结束了,觉得有帮助的话点个赞再走吧😛。

posted on 2023-04-07 23:02  乐之之  阅读(595)  评论(0编辑  收藏  举报