首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python爬虫自动切换代理IP完整代码模板

Python爬虫自动切换代理IP完整代码模板

原创
作者头像
永不掉线的小白
修改2026-06-15 13:29:01
修改2026-06-15 13:29:01
610
举报

爬虫自动换代理IP的逻辑特别简单:准备一批可用代理IP → 每次请求随机挑一个用 → 自动检测IP能不能用 → 删掉失效IP、补充新IP。全程自动化,不用手动干预。

这套模板自带4个超实用核心能力:

  • 每次发送请求自动随机换IP,避免单一IP被网站封禁
  • 自动校验代理有效性,及时剔除超时、失效、被拉黑的IP
  • 请求失败自动换IP重试,大幅提升爬虫请求成功率
  • 同时支持静态IP池、付费动态API代理两种常用场景

环境准备

代码只需要requests库,直接复制下面命令安装就行,其他都是Python自带无需额外安装:

代码语言:javascript
复制
pip install requests

可直接运行的完整代码

这套代码配齐了代理校验、自动换IP、失败重试、无效IP清理所有功能,改下配置就能直接用,新手也能快速上手。

代码语言:javascript
复制
import requests
import random
import time

# ====================== 自定义配置区(只改这里就够了)======================
# 1. 静态代理IP池(格式统一为 http://IP:端口,可批量替换成自己的代理)
PROXY_POOL = [
    "http://113.120.36.122:8080",
    "http://120.79.14.113:8080",
    "http://119.29.155.99:8080",
    "http://106.55.200.138:8080"
]

# 2. 动态代理API(用付费代理就填地址,不用直接留空即可)
PROXY_API_URL = ""

# 3. 爬虫请求基础设置
TIMEOUT = 10  # 请求超时时间,超过10秒直接判定失败
RETRY_TIMES = 3  # 请求失败最多重试3次
TEST_URL = "https://httpbin.org/ip"  # 校验代理的测试接口,可通用
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
# =================================================================

# 实时更新的可用代理池,自动剔除坏IP
usable_proxies = PROXY_POOL.copy()


def get_dynamic_proxy():
    """
    从付费代理API自动获取新IP
    返回:可用的代理IP地址
    """
    try:
        res = requests.get(PROXY_API_URL, timeout=10)
        if res.status_code == 200 and res.text.strip():
            proxy_ip = f"http://{res.text.strip()}"
            return proxy_ip
    except Exception as e:
        print(f"动态代理获取失败:{str(e)}")
    return None


def check_proxy(proxy):
    """检测单个代理是否能用,有效返回True,失效返回False"""
    try:
        res = requests.get(
            url=TEST_URL,
            proxies={"http": proxy, "https": proxy},
            headers=HEADERS,
            timeout=TIMEOUT
        )
        if res.status_code == 200:
            print(f"✅ 代理可用:{proxy},当前访问IP:{res.json().get('origin')}")
            return True
    except Exception as e:
        print(f"❌ 代理失效:{proxy}")
    return False


def get_random_proxy():
    """随机获取一个可用代理,自动清理无效IP、补全新IP"""
    global usable_proxies
    # 代理池空了就尝试更新
    if not usable_proxies:
        print("⚠️ 代理池已用完,正在尝试更新代理...")
        if PROXY_API_URL:
            new_proxy = get_dynamic_proxy()
            if new_proxy and check_proxy(new_proxy):
                usable_proxies.append(new_proxy)
        # 还是没有可用IP就抛出异常
        if not usable_proxies:
            raise Exception("没有可用代理了!请补充IP或检查代理API")

    # 循环筛选有效代理
    while True:
        proxy = random.choice(usable_proxies)
        if check_proxy(proxy):
            return proxy
        else:
            usable_proxies.remove(proxy)
            if not usable_proxies:
                raise Exception("所有代理均已失效,请更新IP池")


def proxy_spider_request(url, method="get", data=None, params=None):
    """
    爬虫通用请求函数,自动换IP+失败重试
    :param url: 要爬的链接
    :param method: 请求方式 get/post
    :param data: post请求参数
    :param params: get请求参数
    :return: 响应对象
    """
    # 循环重试请求
    for i in range(RETRY_TIMES):
        try:
            proxy = get_random_proxy()
            proxies = {"http": proxy, "https": proxy}
            print(f"\n第{i+1}次请求,本次使用代理:{proxy}")

            # 区分GET/POST请求
            if method.lower() == "get":
                res = requests.get(
                    url=url,
                    headers=HEADERS,
                    proxies=proxies,
                    params=params,
                    timeout=TIMEOUT
                )
            else:
                res = requests.post(
                    url=url,
                    headers=HEADERS,
                    proxies=proxies,
                    data=data,
                    timeout=TIMEOUT
                )

            # 请求成功直接返回结果
            if res.status_code in [200, 201, 202]:
                print("🎉 请求成功!")
                return res
            else:
                print(f"⚠️ 状态码异常:{res.status_code},即将换IP重试")
                time.sleep(1)
                continue

        except Exception as e:
            print(f"❌ 请求失败,换代理重试中...")
            time.sleep(1)
            continue

    print(f"❌ 已重试{RETRY_TIMES}次,请求失败,跳过当前链接")
    return None


# 测试运行:验证自动换IP效果
if __name__ == "__main__":
    test_url = "https://httpbin.org/ip"
    # 连续5次请求,观察IP切换效果
    for i in range(5):
        response = proxy_spider_request(test_url)
        if response:
            print("当前请求IP结果:", response.json())
        time.sleep(2)

代码模块简单拆解

1. 代理池配置

适配两种主流使用场景,按需选择就行:

  • 静态IP池:手动填固定IP,适合日常测试、小规模爬虫,稳定性很不错
  • 动态API代理:自动批量获取新IP,适合长期、大规模爬虫项目

2. 代理有效性校验

通过公开的IP检测接口精准校验代理状态,能快速筛掉超时、封禁、无法连接的无效IP,避免做无用请求,节省爬虫资源。

3. 自动换IP+重试机制

每一次网络请求都会随机挑选可用IP,遇到超时、连接失败、状态码异常等问题,会自动换新IP重试,不用手动调试,大幅降低爬虫翻车概率。

超实用进阶优化

1. 付费动态代理对接示例

替换成你自己的代理API地址,就能自动批量获取新IP,不用手动更新IP池:

代码语言:javascript
复制
# 短效API示例(替换自己的订单号和密钥即可)
PROXY_API_URL = "https://zdaye.com/api/getdps/?orderid=xxxxxx&num=1&pt=1&sep=1"

2. 降低风控的小技巧

  • 添加随机等待时间:time.sleep(random.uniform(1, 3)),模拟真人浏览节奏
  • 搭建UA池,每次请求随机切换浏览器标识,伪装更彻底
  • 关闭长连接,避免同一连接复用IP被网站关联风控

3. 容错优化小配置

  • 自动清理连续失效的IP,避免重复调用无效代理
  • 可自行添加消息提醒,代理池耗尽时及时告警
  • 精准区分网络错误、IP封禁、网站反爬,针对性重试不盲目

常见报错快速解决

  • 代理频繁超时:适当调大TIMEOUT数值,优先更换高质量付费代理
  • 经常出现403封禁:放慢请求速度、增加随机延迟,换成独享住宅代理
  • 代理显示可用但爬取失败:目标网站拉黑了代理网段,更换代理池即可
  • 动态API拿不到IP:检查代理账号余额、API参数是否完整、是否超限

简单使用提醒

  • 爬虫务必遵守网站规则,禁止爬取违规、隐私数据,合规使用
  • 免费代理稳定性极差、存活率低,正式爬虫一定要用付费代理
  • 不要超高频率频繁切换IP,容易触发网站风控,适度切换更稳妥
  • 定期清理无效IP,减少无效检测请求,让爬虫运行更流畅

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境准备
  • 可直接运行的完整代码
  • 代码模块简单拆解
    • 1. 代理池配置
    • 2. 代理有效性校验
    • 3. 自动换IP+重试机制
  • 超实用进阶优化
    • 1. 付费动态代理对接示例
    • 2. 降低风控的小技巧
    • 3. 容错优化小配置
  • 常见报错快速解决
  • 简单使用提醒
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档