开发者指南
Proxy Pool 设计为可扩展的架构,允许开发者轻松添加自己的代理源和校验逻辑。本指南将介绍项目的核心模块以及如何进行扩展。
项目结构简介
fetcher/proxyFetcher.py: 定义了所有代理抓取器。每个抓取器都是ProxyFetcher类的一个静态方法。helper/validator.py: 定义了代理校验逻辑。通过装饰器将函数注册为不同阶段的校验器。handler/proxyHandler.py: 封装了对数据库中代理的增、删、改、查等核心操作。db/: 数据库客户端模块,实现了对 Redis 和 SSDB 的支持。api/proxyApi.py: 提供了对外服务的 HTTP API 接口。proxyPool.py: 项目的命令行启动入口和调度器主逻辑。
如何扩展代理源
项目默认包含了一些免费的代理源,但它们的质量可能不稳定。你可以通过以下步骤添加自己的代理获取渠道(例如,付费代理 API、自己搭建的代理服务器等)。
1. 添加抓取方法
打开 fetcher/proxyFetcher.py 文件,在 ProxyFetcher 类中添加一个新的静态方法。这个方法必须:
- 是一个生成器 (使用 yield)。
- 返回 ip:port 格式的字符串。
示例:
# In fetcher/proxyFetcher.py
class ProxyFetcher(object):
# ... existing methods
@staticmethod
def myCustomProxySource():
"""
一个自定义的代理源。
可以从网站、API 或数据库获取代理。
"""
# 假设你从某个 API 获取了代理列表
proxies_from_api = ["10.0.0.1:8888", "10.0.0.2:8888"]
for proxy in proxies_from_api:
# 确保返回格式正确
yield proxy
2. 启用新的抓取器
打开根目录下的 setting.py 文件,将你刚刚创建的方法名添加到 PROXY_FETCHER 列表中。
# In setting.py
PROXY_FETCHER = [
"freeProxy01",
# ... other fetchers
"myCustomProxySource" # 添加你的自定义方法名
]
完成以上两步后,重启调度器,它就会自动调用你的新方法来获取代理了。
如何扩展代理校验逻辑
代理校验分为三个阶段,通过装饰器来区分:
@ProxyValidator.preValidator: 预校验。在代理入库前进行,通常用于检查代理格式是否正确。@ProxyValidator.httpValidator: HTTP 可用性校验。检查代理是否能正常访问 HTTP 网站。只有通过此阶段所有校验的代理才会被认为是可用代理。@ProxyValidator.httpsValidator: HTTPS 可用性校验。检查通过了 HTTP 校验的代理是否也支持 HTTPS。
当一个阶段有多个校验函数时,它们会按定义顺序执行,必须所有函数都返回 True,该阶段的校验才算通过。
示例:添加一个自定义的 HTTP 校验器
假设你需要确保代理不仅能访问目标网站,还能获取到特定的关键词,可以添加如下校验函数。
- 打开
helper/validator.py文件。 - 添加你的自定义校验函数,并使用相应的装饰器。
# In helper/validator.py
fromrequests.compatimport chardet
# ...
@ProxyValidator.addHttpValidator
def customKeywordValidator(proxy):
"""
自定义校验器:检查代理访问百度首页是否能返回特定关键词。
"""
proxies = {"http": f"http://{proxy.proxy}"}
try:
# 使用 verify=False 是因为我们只关心内容,不校验证书
r = requests.get("http://www.baidu.com", headers=HEADER, proxies=proxies, timeout=5, verify=False)
# 检测编码并解码
encoding = chardet.detect(r.content)['encoding']
content = r.content.decode(encoding or 'utf-8')
if r.status_code == 200 and "百度一下" in content:
return True
return False
except Exception:
return False
添加后,这个 customKeywordValidator 会自动被加入到 HTTP 校验流程中。你无需修改其他任何配置。同理,你也可以使用 @ProxyValidator.addHttpsValidator 来添加自定义的 HTTPS 校验逻辑。