众所周知,隧道代理比动态短效代理贵,但是因为其产品特性,确实也更好用更方便,那我们要如何自己搭建起来隧道代理呢?
说来也不复杂,按照我说的方法,即可搭建起来隧道代理。
1.构建HTTP代理池
首先,你手上得有一批HTTP 代理,要么自己去爬免费的资源(不是那么建议,免费的可用率真的非常低),要么就自己去和HTTP厂商购买动态短效代理,要么就从0开始,自己买服务器……总之,你手上得有一批可以使用起来的HTTP代理,搭建起来你的HTTP代理池子。
接下来就是使用 Redis 的 Hash 这个数据结构周期性访问url,拉取当前最新可用的HTTP代理。
代码如下:
"""
ProxyManager.py
~~~~~~~~~~~~~~~~~~~~~
简易代理池管理工具,直接从URL中读取所有
最新的代理,并写入Redis。
"""
import yaml
import time
import json
import redis
import datetime
import requests
class ProxyManager:
def __init__(self):
self.config = self.read_config()
self.redis_config = self.config['redis']
self.client = redis.Redis(host=self.redis_config['host'],
password=self.redis_config['password'],
port=self.redis_config['port'])
self.instance_dict = {}
def read_config(self):
with open('config.yaml') as f:
config = yaml.safe_load(f.read())
return config
def read_ip(self):
resp = requests.get(self.config['proxy']).text
if '{' in resp:
return []
proxy_list = resp.split()
return proxy_list
def delete_ip(self, live_ips, pool_ips):
ip_to_removed = set(pool_ips) - set(live_ips)
if ip_to_removed:
print('ip to be removed:', ip_to_removed)
self.client.hdel(self.redis_config['key'], *list(ip_to_removed))
def add_new_ips(self, live_ips, pool_ips):
ip_to_add = set(live_ips) - set(pool_ips)
if ip_to_add:
print('ip to add:', ip_to_add)
ips = {}
for ip in ip_to_add:
ips[ip] = json.dumps({'private_ip': ip,
'ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')})
self.client.hset(self.redis_config['key'], mapping=ips)
def run(s