拨号VPS你值得拥有

拨号VPS具体干啥用的请自行 Google

Posted by Snake on April 22, 2019

为啥拨号 VPS 你值得拥有?

话说 IP 这个东西对于用 python 搞搞东西的人来说都是很有必要的(你懂得🤔),尝试过多种 IP 方案都觉得不是很好用。

  • 免费代理:极度不稳定;
  • 收费代理:速度非常慢;
  • 本地拨号:切换时间长。

综上所述,在试用了拨号 VPS 之后以上烦恼全部没有了😁

使用拨号 VPS 后的架构变化

传统的 python 爬爬架构都是

应用程序 -> 代理服务器 -> 目标地址

使用拨号 VPS 后的爬爬架构变为

应用程序 -> 反向代理服务器 -> 拨号VPS代理服务器 -> 目标地址

这种架构的最大好处就是优雅,一切都是自动化的,而且可以根据需求随时调整。

这篇文章记录点什么呢?

要完成上述的架构需要的不止是一个环节的配置,而本文只记录拨号 VPS 服务器如何搭建,其它环节的配置有空的时候另文记录。

开始吧……

使用过的各种代理包括西刺代理、站大爷、无极网络、云立方等等,最后用的是云立方的拨号 VPS 服务器,原因大概就是界面还不错、客服挺好的、稳定性没记错的话挺好。

注册账号

注册个云立方账号,注册点这里

买个服务器

由于只是拨号及代理使用,所以一般不需要非常高的性能,我买的 0.5G 100M 的配置,链接这里

购买如下图:

购买截图

配置服务器

1. 更新系统

# yum update -y

2. 安装必要软件

配置 python3.6 数据源

# yum install epel-release https://centos7.iuscommunity.org/ius-release.rpm -y

安装 vim squid httpd-tools python36 pip3

# yum install vim squid httpd-tools python36 python36u-pip -y

3. 配置 squid

配置开机启动

# systemctl enable squid

添加 squid 用户名密码验证

# touch /etc/squid/squid_passwd
# chown squid:squid /etc/squid/squid_passwd
# htpasswd /etc/squid/squid_passwd 你的用户名

修改 squid 配置文件

# vi /etc/squid/squid.conf

添加如下配置,大概在 55 行之前,具体作用请自行 Google。

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/squid_passwd

auth_param basic children 5

auth_param basic realm Squid proxy-caching web server

auth_param basic credentialsttl 2 hours

auth_param basic casesensitive off

acl ncsa_users proxy_auth REQUIRED

http_access allow ncsa_users

如果需要高匿代理(其实是必须的),增加以下配置到配置文件。

request_header_access Via deny all

request_header_access X-Forwarded-For deny all

request_header_access From deny all

如需修改端口请自行修改配置文件

配置自动拨号服务

1. 安装 python 依赖

# pip3.6 install requests-html

2. 创建 vps.py 文件

# vi ~/vps.py

vps.py 文件模板

# -*- coding: utf-8 -*-
import datetime
import os
import traceback

from requests_html import HTMLSession

"""
动态拨号 VPS 循环拨号汇报 IP
"""


def re_pppoe():
    """
    重新拨号并返回 IP

    :return: 新的外网 IP
    :rtype: str
    """
    os.system('/usr/sbin/pppoe-stop')
    os.system('/usr/sbin/pppoe-start')
    result = os.popen('/usr/sbin/pppoe-status')
    ip = ''
    for r in result:
        if r.find('inet') != -1:
            ip = r[r.find('inet') + 5:r.find('peer')].strip()
    return ip


def send_ip(name, ip):
    """
    向服务汇报 IP

    :param name: 拨号 VPS 名称
    :type name: str
    :param ip: IP 信息
    :type ip: str
    :return:
    """
    session = HTMLSession()
    response = None
    try_again = 5
    while try_again > 0:
        try:
            response = session.post(
                url='你的服务地址',
                data={
                    'name': name,
                    'ip': ip
                }
            )
            break
        except Exception:
            try_again -= 1
    if try_again <= 0:
        # 你的错误处理代码
        pass
    if response is not None:
        response.close()
    session.close()


def main():
    """
    主方法,汇报空 IP 然后重新拨号并汇报新 IP。

    :return:
    """
    code = ''
    for r in os.popen('cat ~/.bashrc'):
        if r.find('PS1') != -1:
            code = r[r.find('g')+1:r.find('g')+3]
    my_name = f'vps{code}'
    send_ip(my_name, '0.0.0.0')
    ip = ''
    while ip == '':
        ip = re_pppoe()
    send_ip(my_name, ip)


if __name__ == '__main__':
    main()

3. 配置计划任务

每小时的第0分钟、第10分钟、第20分钟、第30分钟、第40分钟、第50分钟重新拨号并汇报 IP 信息。

# crontab -e

0,10,20,30,40,50 * * * * python3.6 ~/vps.py > /root/vps.log 2>&1 &

拨号相关命令

  • 拨号
# pppoe-start
  • 停止
# pppoe-stop
  • 状态
# pppoe-stauts

还有点啥可以配置?

个人习惯于配置一下用户变量、vi配置、主机名,此节点可配可不配。

  • 用户变量
vi ~/.bashrc
  • vi 配置
vi /etc/vimrc
  • 主机名
hostnamectl set-hostname 你的主机名

还差点啥?

  • 一个接收拨号 VPS 外网 IP 的服务端;
  • 本地 squid 反向代理配置;
  • 一个使用拨号 VPS 爬爬架构的示例程序。

以上几项另文再记吧。

欢迎联系

有问题可以邮件联系。

备忘一下云立方链接

http://www.yunlifang.cn?u=anon9zbg