爬虫代理入门教程:2026年从零开始用代理IP做数据采集
发布时间:2026-04-26 阅读:22
爬虫代理入门教程:2026年从零开始用代理IP做数据采集
摘要:本文是面向新手的爬虫代理完整教程,从"为什么要用代理IP"讲起,逐步演示如何获取代理、配置代理、验证代理有效性,最终搭建一个稳定运行的爬虫代理系统。无论你是做数据采集、竞品分析还是市场研究,这篇教程都能帮你少走弯路。
为什么爬虫需要代理IP?
如果你直接用自己的服务器 IP 去爬取目标网站,通常会遇到三个问题:
- 请求频率限制:大多数网站会对单个 IP 设置请求上限,比如每分钟 60 次,超过就返回 429(Too Many Requests)或直接封禁。
- IP 封禁:当你的爬取行为被识别为爬虫后,目标网站会将你的 IP 加入黑名单,彻底无法访问。
- 地域限制:某些网站的内容会根据访问者 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:代理连不上怎么办?
排查步骤:
- 检查代理地址和端口是否正确
- 用
ping命令测试代理服务器连通性 - 确认账号密码(如果需要认证)是否正确
- 检查是否超出代理服务的并发限制
Q2:用了代理还是被封?
最常见的原因:
- 使用了透明代理(没有真正隐藏 IP)
- 请求频率太高,即使换 IP 也触发了行为检测
- 多个账号共用同一个代理 IP,触发关联风控
- 浏览器指纹(Canvas、WebGL 等)泄漏了真实身份
解决方案:换成高匿住宅代理 + 控制请求频率 + 保持合理的请求间隔。
Q3:代理响应太慢?
- 检查代理 IP 的地理位置,尽量选离目标服务器近的节点
- 隧道代理比单 IP 代理更稳定,建议优先使用
- 设置合理的超时时间(一般 10-15 秒),超时自动换代理
总结:爬虫代理入门路线图
把今天的教程内容整理成一条清晰的学习路径:
第一步:理解代理概念(高匿 > 普通匿名 > 透明)
↓
第二步:选择合适的代理服务(隧道代理新手首选)
↓
第三步:在代码中配置代理(requests 库 5 行代码搞定)
↓
第四步:验证代理有效性(别跳过这步!)
↓
第五步:添加重试和延迟(让爬虫更健壮)
↓
持续优化:根据封禁情况调整代理类型和请求策略
给新手的核心建议:
- 先用隧道代理跑通流程,再考虑自建代理池
- 一定要验证代理,别拿到 IP 就直接用
- 控制频率是基本功,再好的代理也扛不住无限制轰炸
- 遇到封禁先排查原因,换代理不是万能药
需要住宅代理或隧道代理服务? 悟空代理 提供 1000 万+ IP 池,覆盖 300+ 城市,支持 API 提取和隧道代理两种接入方式,新用户可先试用再购买。从高匿住宅代理到隧道代理,满足从新手入门到企业级大规模采集的全场景需求。
