每一个想学习的念头,都有可能是未来的你在向自己求救。

1.写在前面的

本次文章内容需要准备:一台动态 ADSL 拨号服务器,一台普通服务器,一个公网 redis 环境(可以直接部署在前面普通服务器上)。

首先介绍一下 ADSL,ADSL是一种新的数据传输方式。它因为上行和下行带宽不对称,因此称为非对称数字用户线环路。它采用频分复用技术把普通的电话线分成了电话、上行和下行三个相对独立的信道,从而避免了相互之间的干扰。

它有个独有的特点,每拨一次号,就获取一个新的IP。也就是它的IP是不固定的,不过既然是拨号上网嘛,速度也是有保障的,用它搭建一个代理,那既能保证可用,又能自由控制拨号切换(抄自知乎)。

借助 ADSL 拨号服务器特点,我们可以获取一个公网 IP,然后借助第三方工具/软件在服务器上搭建 HTTP 代理就行了。关于搭建 HTTP 代理有很多推荐,比如说 Squid。但是 Squid 这些需要配置信息,对于个人来讲有些麻烦,所以在这篇文章里,我们尝试用 gost 来搭建 HTTP 代理(https://github.com/ginuerzh/gost)。

2.拨号服务器基操

在搭建 HTTP 代理之前,还是先说一下拨号服务器常用操作:

pppoe-start    # 拨号
pppoe-stop        # 断开拨号
pppoe-status   # 拨号连接状态

一般购买拨号服务器之后,使用 ssh 连接上使用pppoe-start命令先进行拨号(不同平台命令可能不一样),成功后可以尝试使用curl ip.sb查看当前获取的新 IP:

[root@localhost ~]# curl ip.sb  # 检查当前ip
171.41.86.191
[root@localhost ~]# pppoe-stop     # 停止当前拨号
[root@localhost ~]# pppoe-start # 开始拨号
[root@localhost ~]# curl ip.sb     # 检查当前ip
171.41.85.191
[root@localhost ~]#

3.搭建 HTTP 代理

上面提到使用 gost 搭建 HTTP 代理,现从 GITHUB 上下载对应的平台 / 版本的 gost。我这里下载的是:gost-linux-amd64-2.11.1,你们可以根据自己需要下载合适的版本。下载之后解压之后得到一个可执行文件:

[root@localhost ~]# ll
total 31508
-rw-------. 1 root root     1319 Sep 29  2019 anaconda-ks.cfg
-rw-r--r--  1 root root  8784858 Dec 14 11:50 file.zip
-rw-r--r--  1 root root 16830464 May 23  2020 gost-linux-amd64 # 就这个这个
-rw-r--r--  1 root root  6643001 Dec  8 22:46 proxy_client # 等会用
[root@localhost ~]#

确定当前拨号成功后直接执行:

[root@localhost ~]# mv gost-linux-amd64 gost     # 重命名(可有可无)
[root@localhost ~]# chmod 777 gost               # 修改权限,必须,不然无法执行
[root@localhost ~]# ./gost -L=admin:123456@:8123 # 设置代理认证信息
2020/12/14 13:52:44 route.go:650: auto://:8123 on [::]:8123

这里可以使用 systemctl 给 gost 做个进程守护,在 /etc/systemd/system/ 路径新建文件 gost.service 内容:

[Unit]
Description=Gost Proxy
After=network.target
Wants=network.target[Service]
Type=simple
ExecStart=/root/gost -L=http://admin:123456@:8123 -L=socks5://admin:123456@:8125 # socks5 根据自己需要设置
Restart=always[Install]
WantedBy=multi-user.target

之后可以直接使用 systemctl 命令控制 gost :

systemctl daemon-reload
systemctl enable gost
systemctl restart gost
systemctl status gost

此时测试当前 HTTP 代理是否可用:

┌──(h1code2㉿LAPTOP-IMECGKD2)-[/mnt/c/Users/h1code2]
└─$ curl -x http://admin:123456@171.41.85.191:8123 http://httpbin.org/ip # 代理测试
{"origin": "171.41.85.191"
}

现在代理测试通过,接着我们要做的就是需要实时将服务器最新拨号成功后的 IP 通知到爬虫。在这里我们可以把拨号服务器理解成客户端,正式场景肯定不会只有一台(如图:),所以我们还需要使用一个服务器端来记录和分配最近可用的代理 IP。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QA3tFTft-1607998556105)(https://imgkr2.cn-bj.ufileos.com/efa71921-374d-4478-9021-b0ef775f62ec.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=OzSIOdBMM8HLNcrn20kAB%252BbtCyw%253D&Expires=1608013699)]

4.客户端 / 服务端实现

为了简化客户端部署,这里使用 go 语言编写客户端代码,并编译成二进制可执行文件,小伙伴们只需要按照自己的需要增加环境变量即可。这里简单讲一下逻辑,客户端会根据配置的接口信息主动连接服务端,在这个过程中会自动上报当前拨号后的 IP 和端口等信息,服务端响应请求后记录 IP 并返回该客户端是否需要切换 IP 的状态。在上面搭建 HTTP 代理的内容里可以看到与 gost 同级下有个文件 proxy_client,这个就是我们的客户端可执行文件。该程序会读取 7 个环境变量分别是:

api_host     # 服务端接口信息host
api_token   # 服务端接口验证token
username    # 代理验证用户名
password    # 代理验证密码
http_port   # http/https代理端口
socks5_port     # socks5代理端口

根据需要设置环境变量:

export api_host=api.h1code2.cn/api/proxy
export api_token=xfsdfhkjf23rfdwef
export username=admin
export password=123456
export http_port=8123
export socks5_port=8125

之后执行 export 大概是这个样子:

[root@localhost ~]# export
···
declare -x api_host="api.h1code2.cn/api/proxy"
declare -x api_token="xfsdfhkjf23rfdwef"
declare -x http_port="8123"
declare -x password="123456"
declare -x socks5_port="8125"
declare -x username="admin"

在运行 proxy_client 文件之前我们还需要,简单实现一下服务端的逻辑,这里使用 redis 做了定时缓存等操作,具体逻辑可以自己实现,我这里随便敲的代码渣,作参考就好。

import ujson as json
from pydantic import BaseModel
from fastapi import APIRouter, Request
from db.session_v2 import redisrouter = APIRouter()hash_key = "proxy-node:hash"
redis_client = redis()class Proxy(BaseModel):http_port: intsocks5_port: intusername: strpassword: str@router.get("/all_proxy")
def all_proxy():"""获取当前所有代理信息:return:"""data = {}nodes = redis_client.hgetall(hash_key)if not nodes:return {"message": "success", "code": 200, "data": data}for key, value in nodes.items():data[key] = json.loads(value)return {"message": "success", "code": 200, "data": data}@router.post("/proxy/{node}/")
def push_proxy_info(node: str, proxy: Proxy, request: Request):"""代理信息上报接口:param node: 客户端节点:param proxy: 代理信息:param request::return: json 包含代理切换状态"""switch_state = Falsestring_key = f"{node}:string"if redis_client.get(string_key) is None:  # 过期switch_state = Trueredis_client.set(string_key, "1", ex=60)if redis_client.get(string_key) == "0":  # 手动切换 / 爬虫程序可控redis_client.set(string_key, "1", ex=60)client_host = request.client.host  # 当前客户端host:port# redis_client.hmset(hash_key, dict(proxy)) # 同时设置多值_dict = dict(proxy)_dict["host"] = client_hostredis_client.hset(hash_key, key=node, value=json.dumps(_dict))return {"message": "success", "code": 200, "data": {"switch_state": switch_state}}

启动 fastapi 服务:

(proxy-venv) ┌──(h1code2㉿LAPTOP-IMECGKD2)-[/mnt/d/PycharmProjects/proxy-test]
└─$ uvicorn service.run:app
INFO:     Started server process [14291]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     171.81.86.81:0 - "POST /api/proxy/node-1/?token=xfsdfhkjf23rfdwef HTTP/1.0" 200 OK
INFO:     171.81.85.51:0 - "POST /api/proxy/node-1/?token=xfsdfhkjf23rfdwef HTTP/1.0" 200 OK
INFO:     171.81.85.51:0 - "POST /api/proxy/node-1/?token=xfsdfhkjf23rfdwef HTTP/1.0" 200 OK

因为我这里代理是运行在本地环境的,使用 frp 做了内网穿透,所以此时 proxy_client 等会通过 api.h1code2.cn/api/proxy/node-1 实际连接的是我们本地的 fastapi 服务,这个并不是必须,你可以直接把 fastapi 接口代码部署公网服务器上。

启动客户端:

[root@localhost ~]# chmod 777 proxy_client # 修改可执行权限
[root@localhost ~]# ./proxy_client
{node:node-1 HttpPort:8123 Socks5Port:8125 Username:admin Password:123456}
switch connect status false 1607958301
switch connect status false 1607958302
switch connect status false 1607958303

客户端程序启动后,可以查看 redis 中已经记录了拨号代理 IP:

127.0.0.1:6379[14]> hgetall proxy-node:hash
1) "node-1"
2) "{\"http_port\":8123,\"socks5_port\":8125,\"username\":\"admin\",\"password\":\"123456\",\"host\":\"171.81.85.51\"}"
127.0.0.1:6379[14]>

也可以通过我们自己实现的接口查看:

┌──(h1code2㉿LAPTOP-IMECGKD2)-[/mnt/c/Users/h1code2]
└─$ curl http://api.h1code2.cn/api/all_proxy
{"message": "success","code": 200,"data": {"node-1": {"http_port": 8123,"socks5_port": 8125,"username": "admin","password": "123456","host": "171.81.85.51"}}
}

测试一下当前代理:

┌──(h1code2㉿LAPTOP-IMECGKD2)-[/mnt/c/Users/h1code2]
└─$ curl -x http://admin:123456@171.81.85.51:81233 ip.sb
171.81.85.51

关于 proxy_client 文件我放置在 https://github.com/h1code2/proxy_client ,更多爬虫 / 逆向相关内容可以进球讨论:

使用ADSL拨号服务器搭建自己的代理IP相关推荐

  1. 第11篇- 抓取免费代理IP并搭建自己的代理IP池

    提前声明:该专栏涉及的所有案例均为学习使用,如有侵权,请联系本人删帖! 文章目录 一.前言 二.了解代理IP 三.抓取代理ip网站 四.完整代码 一.前言 使用代理IP原因:对于我们数据抓取来说,由于 ...

  2. Linux + ProxyPool 搭建属于爬虫代理IP池

    前言: 当爬虫达到一定速度时,大家都会遇到封Ip的情况,而搭建代理ip池是解决的最好方法,网络上有很多优秀的付费代理,但是作为白嫖党的我们又怎么能付钱那,本文将教会大家用一个成熟的开源项目搭建代理池. ...

  3. Python之爬虫 搭建代理ip池

    文章目录 前言 一.User-Agent 二.发送请求 三.解析数据 四.构建ip代理池,检测ip是否可用 五.完整代码 总结 前言 在使用爬虫的时候,很多网站都有一定的反爬措施,甚至在爬取大量的数据 ...

  4. 代理IP在HTTP爬虫中的应用

    网络爬虫是一种重要的技术,用于从互联网上获取和分析数据.为了提高爬虫的效率和稳定性,使用代理IP成为一种常见的实践.本文将介绍代理IP的概念及其在HTTP爬虫中的应用.我们将讨论代理IP的选择与获取. ...

  5. 通过Python利用ADSL服务器和tinyproxy构建数据自己的动态代理IP池,用django+redis做web服务,提供IP接口

    应公司业务需求需要在一些地方使用代理,要求连通率高,速度快,最主要的还要便宜,对比多家供应商后,最后还是决定自购拨号服务搭建代理IP池. 需要配置:1.一台或多台adsl服务器(用以提供IP,可网上购 ...

  6. Python使用Tornado+Redis维护ADSL拨号服务器代理池

    们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以当 ...

  7. 搭建ADSL自动拨号高匿代理池

    搭建ADSL自动拨号高匿代理池 adsl这种服务器网上有很多, 各位自己选择一个服务商购买就行. 搭建服务器环境: centos7 64位 首先购买后,连上服务器先进行拨号, 我这里的拨号命令是 pp ...

  8. vps搭建代理ip服务

    伪装ip是做爬虫比较常见也比较重要的一步. 本文记录centos7.6拨号搭建代理ip服务器的过程. 一.购买拨号服务器. 在服务器测试拨号是否正常用到下面两个命令 pppoe-start pppoe ...

  9. 什么是HTTP代理池,如何搭建代理IP池?

    在爬虫采集数据的时候,我们通常会说到一个问题:要有足够大的IP池子,很多HTTP代理厂商也会强调自己的IP池子是几百万/几千万级别的,那对于爬虫小白来说,代理IP池子到底是什么呢? 简单来说,你可以把 ...

  10. 使用Tornado+Redis维护ADSL拨号服务器代理池

    我们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以 ...

最新文章

  1. 08-图7 公路村村通
  2. matlab 通过矩阵变换使图像旋转平移_opencv图像处理——几何变换
  3. 获取浏览器窗口_全面认识区块链浏览器--看穿币圈的蒙蔽与欺骗!
  4. .bat文件该图标_电脑桌面图标变成白色方块图标怎么办?
  5. spark.mllib源码阅读:GradientBoostedTrees
  6. 史上最黑科技 | 人造肌肉、DNA折叠、柔性外骨骼…
  7. Mipmap纹理技术简介
  8. Android美工坊--一个QQ登录验证的小例子
  9. 阿里发布天猫精灵X1 探索人机交互新大陆
  10. python构造函数_Python构造函数
  11. uuid会重复吗_UUID的版本你知道吗
  12. windows 子系统认识(1)
  13. 各式标签二维码明确采用QR码或DM码,其两种不同码制的区别表现
  14. 7-5 华氏度转摄氏度(四舍五入) (5分)
  15. 工程制图计算机绘图实训总结感悟,工程制图心得体会.doc
  16. html椭圆的写法,4.8 把圆变换为椭圆 - HTML5 Canvas 实战
  17. 使用JS取得焦点(focus)元素
  18. 边云协同的优点_云边协同的现实意义
  19. 产品经理常用工作方法及原则汇总
  20. 我的3D之路-----非教科书式3D计算机图形学零起点全攻略

热门文章

  1. [初学笔记] pause 语句 的运用,.m文件中按任意键继续程序或者延迟秒数继续程序
  2. numpy.meshgrid()绘制网格图
  3. maya要学python吗_Maya入门为什么会这么难?
  4. java文件恢复软件,误删文件恢复-误删文件恢复大师 v1.1.0 最新版
  5. 计算机时区找不到北京,电脑时区里为何没有标准北京时间
  6. python转义字符与原字符
  7. 《Processing SPARQL queries over distributed RDF graphs》——读书笔记
  8. NameNode作用
  9. 南华大学计算机科学学院,南华大学计算机科学与技术学院介绍
  10. chromecast 协议_如何解决常见的Google Chromecast问题