Skip to content

IP 代理池 的详细使用方法,涵盖代理池的搭建、维护及在爬虫中的应用:


1. 代理池的核心功能

  • 代理采集:从免费/付费代理网站抓取 IP。
  • 代理验证:测试 IP 的可用性和匿名性。
  • 代理存储:将可用 IP 存入数据库(如 Redis、MySQL)。
  • 动态调度:自动剔除失效 IP,补充新 IP。

2. 搭建代理池(以开源项目 ProxyPool 为例)

步骤 1: 安装依赖

bash
git clone https://github.com/jhao104/proxy_pool.git
cd proxy_pool
pip install -r requirements.txt

步骤 2: 配置数据库(Redis)

修改 setting.py

python
DB_CONN = 'redis://localhost:6379/0'

步骤 3: 启动服务

bash
# 启动调度程序(采集+验证)
python proxyPool.py schedule

# 启动 API 服务(提供代理接口)
python proxyPool.py server

3. 使用代理池

通过 API 获取代理

bash
# 获取一个随机代理
curl http://localhost:5010/get

在 Python 代码中调用

python
import requests


def get_proxy():
    response = requests.get("http://localhost:5010/get")
    return response.json().get("proxy")


proxy = get_proxy()
proxies = {
    "http": f"http://{proxy}",
    "https": f"http://{proxy}"
}

# 在请求中使用代理
response = requests.get("https://example.com", proxies=proxies, timeout=10)

4. 集成到爬虫框架

在 Requests 中自动切换代理

python
import requests
from retrying import retry


@retry(stop_max_attempt_number=3)
def fetch(url):
    proxy = get_proxy()  # 从代理池获取
    proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"}
    try:
        response = requests.get(url, proxies=proxies, timeout=10)
        return response.text
    except:
        # 标记代理为失效
        requests.get(f"http://localhost:5010/delete?proxy={proxy}")
        raise

在 Scrapy 中通过中间件使用

修改 middlewares.py

python
import requests


class ProxyMiddleware:
    def process_request(self, request, spider):
        proxy = requests.get("http://localhost:5010/get").json().get("proxy")
        request.meta["proxy"] = f"http://{proxy}"

settings.py 中启用中间件:

python
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.ProxyMiddleware': 543,
}

5. 代理池维护技巧

验证代理匿名性

python
def check_anonymity(proxy):
    url = "http://httpbin.org/ip"
    try:
        response = requests.get(url, proxies={"http": f"http://{proxy}"}, timeout=10)
        if proxy.split(":")[0] not in response.text:
            return True  # 高匿代理
    except:
        return False

定时更新代理

  • 使用 Celery 或 APScheduler 定时触发采集任务。
  • 每天清理一次数据库中的旧代理。

6. 自建代理池核心代码(简化版)

python
import requests
from redis import Redis


class ProxyPool:
    def __init__(self):
        self.redis = Redis(host='localhost', port=6379, db=0)
        self.proxy_sources = [
            "https://www.free-proxy-list.net",
            "https://www.sslproxies.org"
        ]

    def crawl_proxies(self):
        for url in self.proxy_sources:
            response = requests.get(url)
            # 解析页面提取 IP:Port,存入临时集合
            # ...

    def validate_proxies(self):
        temp_proxies = self.redis.smembers("temp_proxies")
        for proxy in temp_proxies:
            if self.check_proxy(proxy):
                self.redis.sadd("valid_proxies", proxy)

    def check_proxy(self, proxy):
        try:
            response = requests.get(
                "https://httpbin.org/ip",
                proxies={"http": f"http://{proxy}"},
                timeout=5
            )
            return response.status_code == 200
        except:
            return False

7. 代理类型选择

代理类型特点适用场景
透明代理目标服务器知道真实 IP不推荐用于爬虫
匿名代理隐藏真实 IP,但提示使用代理一般防护
高匿代理完全隐藏 IP 和代理使用痕迹反爬严格的目标网站

8. 注意事项

  1. 法律合规:确保代理来源合法,避免侵犯隐私。
  2. 性能平衡:代理数量与验证频率需权衡(建议保持 100-500 个可用代理)。
  3. 混合使用:结合付费代理(稳定)和免费代理(降低成本)。

通过代理池,可以有效解决 IP 封禁问题,提升爬虫的健壮性。对于高价值数据采集,建议购买商业代理服务(如 BrightData、Oxylabs)。

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer