adsl撥號服務器構建代理池


 

一、工具准備

動態vps: 我用的是雲立方的動態vps,0.5G內存,11G硬盤,20G寬帶,一年1800元,動態vps主要是運行代理服務,比較耗寬帶,通過撥號來更換IP,實現動態代理的效果
固定IP服務器:用的阿里雲服務器,1核1G內存,40G雲盤,一年836元,該服務器主要是實時獲取動態vps的IP,並對外提供接口,這些服務不怎么耗資源,該服務器還可以用來跑爬蟲或者搭網站
二、環境搭建

動態vps

功能:搭建代理服務,並通過在vps上撥號切換IP,將切換后的IP傳到固定IP的服務器上
工具:代理服務-tinyproxy, 發送IP-python的requests庫
系統:雲立方的可以預裝系統,我選的是CentOS7.1系統,在管理后台進行操作
連接服務器:ssh user@ip -p port
撥號操作:斷開網絡:adsl-stop, 撥號:adsl-start
查看公網IP:curl icanhazip.com
加代理查看IP:curl -x ‘ip:port’ -v icanhazip.com
判斷IP是否變化:先查看公網IP,然后斷開連接,重新撥號,再看下公網IP,如果發現沒有變化,可以多試幾次,有幾率重播后公網IP依舊沒變
1、代理服務搭建:tinyproxy

安裝命令:

# 添加EPEL倉庫,然后更新yum源:
sudo yum install epel-release
sudo yum update
# 安裝
sudo yum install -y tinyproxy
1
2
3
4
5
修改配置:

vim /etc/tinyproxy/tinyproxy.conf
修改 Port 端口,默認為 8888
Port 8888
注釋掉 Allow 127.0.0.1,表示允許所有人訪問代理
1
2
3
4
啟動服務:service tinyproxy start
日志:/var/log/tinyproxy/tinyproxy.log
本地測試:curl -x ‘ip:port’ -v icanhazip.com

注意點&坑:

我一開始用的芝麻VPS,到這一步后,在vps上用局域網IP可以通過代理服務器訪問,但在本地通過公網IP就無法訪問,最后發現是由於外網無法訪問該服務器,試過開放端口等操作,無果,雲立方的是直接可以通過公網IP使用代理

yum安裝時,報錯:yum doesn’t have enough cached data to continue, 解決辦法:

將/etc/yum.repos.d/epel.repo中的mirrorlist改為baseurl
/etc/resolv.conf文件中增加 nameserver 144.144.144.144
在斷開重播時,有時adsl-start會執行失敗,報錯:“/usr/sbin/adsl-start: line 217: 5749 Terminated CONNECT" CONNECT "CONNECT"@" > /dev/null 2>&1”,最后發現可能是斷開連接的不干凈,多執行幾次adsl-stop,在執行adsl-start就會成功了

在代理服務tinyproxy運行期間,報過這個錯:Waiting servers (0) is less than MinSpareServers (5). Creating new child.,原因是達到最大連接數,無法創建新的連接處理請求,代理服務也就掛了,重啟代理服務即可,解決辦法

定時重啟tinyproxy服務
修改配置
vim /etc/tinyproxy/tinyproxy.conf
MaxClients 100 -> 500 # 最大連接數
Timeout 600 -> 20 # 超時時間
1
2
3
2、搭建Python環境

(1) 安裝Python
Python依賴

sudo yum install yum-utils
sudo yum-builddep python
1
2
Python源碼連接:https://www.python.org/ftp/python/

curl -O https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz
1
我在用curl時無法下載,可以到官網下載指定版本的Python,然后傳到服務器上

tar xf Python-3.5.0.tgz
cd Python-3.5.0
./configure
make
sudo make install
1
2
3
4
5
安裝完成后通過python3 -V來查看當前版本

(2) 安裝虛擬環境

cd ~
mkdir venv
cd venv
python3 -m venv python3-forcrawl
source ~/venv/python3-forcrawl/bin/activate
1
2
3
4
5
(3) 安裝相應的python庫

pip install requests
# 安裝其他環境導出的庫
pip install -r requirements.txt
1
2
3
阿里雲服務器:

功能:接受動態VPS發送的IP,並提供接口,返回動態VPS實時的IP&端口
工具:web服務-tornado
連接:ssh root@ip -p 22, 如果忘記服務器密碼,可以重置實例登陸密碼和遠程連接密碼:更多->密碼、秘鑰
搭建Python環境同上,安裝tornado
pip install tornado
1
redis數據庫
sudo yum install -y redis
# 啟動服務
redis-server >> /dev/null 2>&1 &
# 連接redis
redis-cli
1
2
3
4
5
mongo數據庫(可以不進行安裝,實現基本的代理功能不需要該庫)
# yum中沒有mongo的下載源,需要手動添加
vi /etc/yum.repos.d/mongodb-org-3.4.repo
# 寫入以下信息,針對centos7
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
# 安裝
sudo yum install -y mongodb-org
啟動:
systemctl start mongod.service
1
2
3
4
5
6
7
8
9
10
11
12
13
注意點&坑:

ssh鏈接時,報錯Permission denied (publickey,gssapi-keyex,gssapi-with-mic),解決辦法:
通過阿里雲web終端登錄到服務器,修改ssh配置文件
vim /etc/ssh/sshd_config
更改:PasswordAuthentication no(默認yes)
或打開注釋:PermitRootLogin yes
代碼實現邏輯

1、客戶端:動態vps

通過Python執行斷開連接&撥號的操作,成功后匹配獲取公網IP,通過requests庫將IP發送至服務端
為了避免惡意干擾,可以加上一個傳輸秘鑰,服務器驗證傳輸秘鑰,驗證失敗的不進行IP更新
設置定時任務來實現IP的更換
傳送的數據中,包含IP、秘鑰、name(區分vps服務器)
2、服務端:固定IP服務器

使用tornado啟動服務,提供兩個接口

post接口:接收客戶端發送的IP,驗證秘鑰成功后,以name為key,ip&port為val,存入redis
get接口:從redis中取出ip&port並返回
代理檢測程序:可用於檢測IP的可用性,剔除失效IP

總結

相對直接購買代理,價格更便宜,且速度不受限制,但是缺點是,在vps撥號,到傳輸到服務器,再到爬蟲使用代理,這個過程存在延遲,可能在切換IP時,會導致代理不可用,解決方案是設置超時時間並休眠幾秒后進行重試
不適用於對IP切換速度要求很快的服務,撥號太頻繁了,一個是IP有時不變,另一個容易撥號失敗
如果在線上環境中使用,可以多買幾台動態vps,搞一個IP池
代碼實現見:https://github.com/HLFYY/spiders/tree/master/adsl_server
————————————————
版權聲明:本文為CSDN博主「HLFYY1314」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_41074255/article/details/90728307


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM