爬虫代理入门教程:2026年从零开始用代理IP做数据采集

发布时间:2026-04-26  阅读:19

爬虫代理入门教程:2026年从零开始用代理IP做数据采集

摘要:本文是面向新手的爬虫代理完整教程,从"为什么要用代理IP"讲起,逐步演示如何获取代理、配置代理、验证代理有效性,最终搭建一个稳定运行的爬虫代理系统。无论你是做数据采集、竞品分析还是市场研究,这篇教程都能帮你少走弯路。


为什么爬虫需要代理IP?

如果你直接用自己的服务器 IP 去爬取目标网站,通常会遇到三个问题:

  1. 请求频率限制:大多数网站会对单个 IP 设置请求上限,比如每分钟 60 次,超过就返回 429(Too Many Requests)或直接封禁。
  2. IP 封禁:当你的爬取行为被识别为爬虫后,目标网站会将你的 IP 加入黑名单,彻底无法访问。
  3. 地域限制:某些网站的内容会根据访问者 IP 的地理位置返回不同结果,比如电商在不同城市展示的价格可能不同。

代理 IP 的作用就是帮你解决这些问题。 它相当于一个中间人——你的爬虫请求先发到代理服务器,再由代理服务器转发给目标网站。目标网站看到的是代理的 IP,而不是你的真实 IP。

形象地说,代理 IP 就像给爬虫换了一套"马甲"。一件马甲脏了(被封了),换一件继续用。

代理 IP 的核心概念

在动手之前,先搞清楚几个关键概念,这能帮你少走很多弯路。

1. 按匿名程度分类

代理类型 是否隐藏真实 IP 是否暴露代理身份 适用场景
透明代理 ❌ 不隐藏 ✅ 暴露 不推荐用于爬虫
普通匿名 ✅ 隐藏 ✅ 暴露 低要求场景
高匿代理 ✅ 隐藏 ❌ 不暴露 爬虫首选

透明代理是最容易踩的坑。 它会在 HTTP 请求头中带上 X-Forwarded-For 字段,直接把你的真实 IP 告诉目标网站。这就是为什么"用了代理还是被封"的最常见原因。

2. 按使用方式分类

  • 独享代理:一个 IP 只给你用,纯净度高,价格贵。适合账号登录、敏感业务。
  • 共享代理:多个用户共用同一个 IP 池,价格便宜,但 IP 可能被滥用过。适合一般数据采集。
  • 隧道代理:无需手动管理 IP 池,代理服务商自动轮换,只需一个固定入口地址。上手最简单。

3. 按 IP 来源分类

  • 机房代理(数据中心 IP):来自云服务器,速度快、价格便宜,但容易被识别。
  • 住宅代理:来自真实家庭宽带,伪装度最高,不容易被反爬系统识别。2026 年主流选择。

第一步:获取代理 IP

方案一:使用付费代理服务(推荐)

对于生产环境,付费代理是最省心的选择。主流代理服务商都提供 API 接口,可以直接提取 IP 列表或使用隧道代理。

悟空代理为例,开通服务后你会获得:

  • API 提取地址:通过 HTTP 请求获取可用 IP 列表
  • 隧道代理入口:一个固定的代理地址,内部自动轮换 IP
  • 控制台管理面板:查看 IP 使用量、黑名单、请求统计等

方案二:自建代理池

如果你有技术基础且预算有限,可以自建代理池:

import requests

# 从代理服务商 API 获取 IP 列表
def fetch_proxy_list(api_url):
    response = requests.get(api_url)
    if response.status_code == 200:
        # 假设返回格式为: [{"ip": "1.2.3.4", "port": 8080}, ...]
        return response.json()
    return []

# 示例:获取 10 个代理 IP
proxy_api = "https://api.wukongdaili.com/get?num=10&format=json"
proxies = fetch_proxy_list(proxy_api)
print(f"获取到 {len(proxies)} 个代理IP")

方案三:使用免费代理(仅限测试)

网上有一些免费代理列表网站,但需要注意:

  • 免费代理大多是透明代理,安全性差
  • 存活时间短,可用率通常低于 20%
  • 可能被恶意用户滥用,存在数据泄露风险

结论:生产环境不要用免费代理。 测试阶段可以试试,但正式项目一定要用付费代理。

第二步:在 Python 中配置代理

方式一:requests 库(最常用)

import requests

# 配置代理
proxy = {
    "http": "http://username:password@proxy.wukongdaili.com:8080",
    "https": "http://username:password@proxy.wukongdaili.com:8080"
}

# 使用代理发送请求
response = requests.get("https://example.com", proxies=proxy, timeout=10)
print(response.status_code)
print(response.text[:200])

方式二:requests + 代理池(自动轮换)

当爬取量大时,需要自动轮换代理:

import requests
import random

class ProxyPool:
    def __init__(self, api_url):
        self.api_url = api_url
        self.proxies = []
        self._refresh()

    def _refresh(self):
        """从 API 获取新的代理列表"""
        response = requests.get(self.api_url)
        self.proxies = [
            f"http://{p['ip']}:{p['port']}" 
            for p in response.json()
        ]

    def get_random_proxy(self):
        """随机返回一个代理"""
        if not self.proxies:
            self._refresh()
        return random.choice(self.proxies)

# 使用示例
pool = ProxyPool("https://api.wukongdaili.com/get?num=10")
for i in range(100):
    proxy_url = pool.get_random_proxy()
    try:
        response = requests.get(
            "https://example.com/page/" + str(i),
            proxies={"http": proxy_url, "https": proxy_url},
            timeout=5
        )
        print(f"第 {i} 页,状态码:{response.status_code}")
    except Exception as e:
        print(f"请求失败:{e}")

方式三:隧道代理(最简单)

隧道代理不需要管理 IP 池,配置一次即可:

import requests

# 隧道代理:一个固定入口,内部自动换 IP
proxy = {
    "http": "http://tunnel.wukongdaili.com:16816",
    "https": "http://tunnel.wukongdaili.com:16816"
}

# 每次请求都走同一个入口,但出口 IP 自动轮换
for i in range(100):
    response = requests.get(
        "https://example.com/page/" + str(i),
        proxies=proxy,
        timeout=10
    )
    print(f"第 {i} 页,状态码:{response.status_code}")

隧道代理 vs 自建代理池的选择建议:

  • 新手入门 → 直接用隧道代理,零配置
  • 小规模采集(日请求 < 10 万)→ 隧道代理更稳定
  • 大规模采集(日请求 > 10 万)→ 自建代理池更灵活可控

第三步:验证代理是否有效

拿到代理 IP 后,第一件事不是直接爬目标网站,而是先验证代理能不能用

方法一:请求公网 IP 查询服务

def check_proxy(proxy_url):
    """检查代理是否可用,并返回代理的真实出口 IP"""
    try:
        response = requests.get(
            "https://httpbin.org/ip",
            proxies={"http": proxy_url, "https": proxy_url},
            timeout=5
        )
        if response.status_code == 200:
            real_ip = response.json()["origin"]
            print(f"✅ 代理可用,出口IP:{real_ip}")
            return True, real_ip
    except Exception as e:
        print(f"❌ 代理不可用:{e}")
    return False, None

# 验证一个代理
check_proxy("http://1.2.3.4:8080")

方法二:批量验证代理池

def validate_proxy_pool(proxy_list):
    """批量验证代理,返回可用代理列表"""
    valid_proxies = []
    for proxy in proxy_list:
        is_valid, ip = check_proxy(proxy)
        if is_valid:
            valid_proxies.append(proxy)

    print(f"验证完成:{len(valid_proxies)}/{len(proxy_list)} 个代理可用")
    return valid_proxies

关键验证指标

验证代理时,建议同时记录以下指标:

指标 说明 合格标准
响应时间 代理请求的延迟 < 2 秒
可用率 验证通过的代理占比 > 95%
IP 类型 出口 IP 是住宅还是机房 住宅优先
匿名度 是否暴露真实 IP 高匿

第四步:编写健壮的爬虫代码

有了可用的代理后,还需要让爬虫代码足够"健壮",才能在大规模爬取中稳定运行。

1. 添加重试机制

import time

def robust_request(url, pool, max_retries=3):
    """带重试的代理请求"""
    for attempt in range(max_retries):
        proxy = pool.get_random_proxy()
        try:
            response = requests.get(
                url,
                proxies={"http": proxy, "https": proxy},
                timeout=10
            )
            if response.status_code == 200:
                return response
            elif response.status_code in [403, 429]:
                # 被禁止或限流,换代理重试
                print(f"状态码 {response.status_code},换代理重试 ({attempt+1}/{max_retries})")
                time.sleep(2)
                continue
        except requests.exceptions.Timeout:
            print(f"请求超时,换代理重试 ({attempt+1}/{max_retries})")
            time.sleep(1)
            continue
        except Exception as e:
            print(f"请求异常:{e},换代理重试 ({attempt+1}/{max_retries})")
            time.sleep(1)
            continue

    return None  # 所有重试都失败

2. 控制请求频率

别让你的爬虫像个机器人一样疯狂发请求。适当的间隔不仅保护目标服务器,也降低被封概率:

import time
import random

def crawl_with_delay(url, pool, delay_range=(1, 3)):
    """带随机延迟的请求"""
    # 模拟人类操作,随机等待 1-3 秒
    time.sleep(random.uniform(*delay_range))
    return robust_request(url, pool)

3. 设置合理的请求头

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",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
}

response = requests.get(url, proxies=proxy, headers=headers, timeout=10)

第五步:常见问题排查

Q1:代理连不上怎么办?

排查步骤:

  1. 检查代理地址和端口是否正确
  2. ping 命令测试代理服务器连通性
  3. 确认账号密码(如果需要认证)是否正确
  4. 检查是否超出代理服务的并发限制

Q2:用了代理还是被封?

最常见的原因:

  • 使用了透明代理(没有真正隐藏 IP)
  • 请求频率太高,即使换 IP 也触发了行为检测
  • 多个账号共用同一个代理 IP,触发关联风控
  • 浏览器指纹(Canvas、WebGL 等)泄漏了真实身份

解决方案:换成高匿住宅代理 + 控制请求频率 + 保持合理的请求间隔。

Q3:代理响应太慢?

  • 检查代理 IP 的地理位置,尽量选离目标服务器近的节点
  • 隧道代理比单 IP 代理更稳定,建议优先使用
  • 设置合理的超时时间(一般 10-15 秒),超时自动换代理

总结:爬虫代理入门路线图

把今天的教程内容整理成一条清晰的学习路径:

第一步:理解代理概念(高匿 > 普通匿名 > 透明)
    ↓
第二步:选择合适的代理服务(隧道代理新手首选)
    ↓
第三步:在代码中配置代理(requests 库 5 行代码搞定)
    ↓
第四步:验证代理有效性(别跳过这步!)
    ↓
第五步:添加重试和延迟(让爬虫更健壮)
    ↓
持续优化:根据封禁情况调整代理类型和请求策略

给新手的核心建议:

  1. 先用隧道代理跑通流程,再考虑自建代理池
  2. 一定要验证代理,别拿到 IP 就直接用
  3. 控制频率是基本功,再好的代理也扛不住无限制轰炸
  4. 遇到封禁先排查原因,换代理不是万能药

需要住宅代理或隧道代理服务? 悟空代理 提供 1000 万+ IP 池,覆盖 300+ 城市,支持 API 提取和隧道代理两种接入方式,新用户可先试用再购买。从高匿住宅代理到隧道代理,满足从新手入门到企业级大规模采集的全场景需求。

下一篇:爬虫代理选型指南:2026年选代理看这几点就够了

悟空代理注册送ip
免费试用

客服

在线客服:

:3329077489

:18328351249 / 13316588914

:service@wukongdaili.com

售后客服微信二维码 售后客服

技术客服微信二维码 技术客服