Python爬虫被封怎么办?代理IP防封实战指南
发布时间:2026-03-25 阅读:13
摘要
爬虫被封是数据采集中最头疼的问题之一。本文详细讲解爬虫被封的常见原因,以及如何通过代理IP组合策略(轮换、验证、限速)规避反爬机制,并提供可运行的Python实战代码,帮你构建稳定的采集系统。

一、爬虫被封的常见原因
1. IP封禁
目标网站会对异常IP进行封禁。当同一个IP在短时间内发出大量请求,或者访问模式不符合正常用户行为时,网站会直接将该IP加入黑名单。封禁可能是临时的(几分钟到几小时),也可能是永久的。
2. 请求频率过高
没有控制请求速度,短时间内发送大量请求,是爬虫被封的最常见原因。正常用户浏览网页的频率远低于爬虫程序,如果你的请求频率明显高于人工操作,就会触发反爬机制。
3. 行为检测
现代网站不仅看IP,还会分析访问模式。例如:
- 访问路径:正常用户会先访问首页,再访问详情页,而爬虫可能直接抓取数据接口
- 访问时间:固定时间间隔的请求明显是机器行为
- User-Agent:使用固定的User-Agent或非浏览器User-Agent很容易被识别
- Cookie缺失:不携带Cookie或Cookie不符合正常会话模式
4. 蜜罐陷阱
一些网站会设置隐藏的链接(人类看不到但爬虫会跟随),一旦触发就会被封禁。
二、代理IP防封的核心策略
1. IP轮换
使用代理IP池,每次请求使用不同的IP地址,分散请求压力。建议使用稳定的代理服务,如悟空代理,提供住宅静态IP和隧道代理,IP质量高、可用率高。
2. 延迟控制
在请求之间添加随机延迟,模拟人类访问行为。建议延迟时间设置在1-5秒之间随机浮动,避免固定间隔。
3. 住宅IP vs 数据中心IP
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 住宅IP | 来自真实家庭网络,隐蔽性高,不容易被识别和封禁 | 高防护网站、数据采集 |
| 数据中心IP | 来自服务器机房,便宜但容易被反爬系统标记 | 轻度防护网站、测试 |
对于高防护网站,建议使用住宅代理IP。
4. 代理验证
在使用代理之前,先验证代理的可用性和匿名性。可以通过 httpbin.org 等服务检测代理是否暴露了真实IP。
5. 请求头设置
合理设置User-Agent、Accept、Accept-Language等请求头,模拟真实浏览器。建议准备一个 User-Agent池,每次请求随机选择。
三、Python实战代码
1. requests代理配置
import requests
# 代理配置
proxies = {
'http': 'http://username:password@proxy.example.com:8080',
'https': 'http://username:password@proxy.example.com:8080'
}
# 简单请求示例
response = requests.get(
'https://example.com',
proxies=proxies,
timeout=10
)
print(response.status_code)
print(response.text)
2. 代理池轮换
import requests
import random
import time
class ProxyPool:
def __init__(self, proxy_list):
self.proxy_list = proxy_list
self.current_index = 0
def get_proxy(self):
"""随机获取一个代理"""
return random.choice(self.proxy_list)
def get(self, url, **kwargs):
"""使用随机代理发送请求"""
proxy = self.get_proxy()
proxies = {
'http': f'http://{proxy}',
'https': f'http://{proxy}'
}
# 添加随机延迟
time.sleep(random.uniform(1, 3))
return requests.get(url, proxies=proxies, **kwargs)
# 使用示例
proxy_list = [
'username:password@proxy1.example.com:8080',
'username:password@proxy2.example.com:8080',
'username:password@proxy3.example.com:8080',
]
pool = ProxyPool(proxy_list)
# 抓取多个页面
urls = ['https://example.com/page1', 'https://example.com/page2']
for url in urls:
try:
response = pool.get(url, timeout=10)
print(f'成功: {url} - 状态码: {response.status_code}')
except Exception as e:
print(f'失败: {url} - 错误: {e}')
3. 代理验证函数
import requests
def validate_proxy(proxy):
"""验证代理可用性和匿名性"""
try:
proxies = {
'http': f'http://{proxy}',
'https': f'http://{proxy}'
}
# 检测代理是否暴露真实IP
response = requests.get(
'https://httpbin.org/ip',
proxies=proxies,
timeout=5
)
if response.status_code == 200:
ip_info = response.json()
print(f'代理IP: {ip_info.get("origin", "未知")}')
return True
except Exception as e:
print(f'代理验证失败: {proxy} - {e}')
return False
# 使用示例
proxy = 'username:password@your-proxy.com:8080'
if validate_proxy(proxy):
print('代理可用')
else:
print('代理不可用')
4. 完整爬虫示例(带错误重试)
import requests
import random
import time
from requests.exceptions import RequestException
class SmartCrawler:
def __init__(self, proxy_pool):
self.proxy_pool = proxy_pool
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
def fetch(self, url, max_retries=3):
"""带重试的抓取方法"""
for attempt in range(max_retries):
proxy = self.proxy_pool.get_proxy()
proxies = {
'http': f'http://{proxy}',
'https': f'http://{proxy}'
}
try:
# 随机延迟1-5秒
time.sleep(random.uniform(1, 5))
response = self.session.get(
url,
proxies=proxies,
timeout=15
)
if response.status_code == 200:
return response.text
elif response.status_code == 403:
print(f'被封禁,更换代理重试...')
continue
else:
print(f'状态码: {response.status_code}')
except RequestException as e:
print(f'请求错误: {e}')
return None
# 使用示例
proxy_pool = ProxyPool([
'user:pass@proxy1.example.com:8080',
'user:pass@proxy2.example.com:8080',
])
crawler = SmartCrawler(proxy_pool)
content = crawler.fetch('https://example.com')
if content:
print('抓取成功')
四、常见问题解答
Q1: 代理IP去哪里购买?
推荐使用悟空代理(www.wukongdaili.com),提供住宅静态IP、隧道代理等多种类型,IP质量稳定,适合各种爬虫场景。
Q2: 免费代理能用吗?
免费代理质量参差不齐,稳定性差、速度慢、容易泄露数据。建议仅用于学习测试,生产环境务必使用付费代理服务。
Q3: 代理被封了怎么办?
- 增加代理池数量
- 降低请求频率
- 使用更高质量的住宅代理
- 切换不同的代理服务商
Q4: 如何选择代理类型?
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 短效代理 | 适合大规模快速抓取,需要频繁更换IP | 大规模数据采集 |
| 静态代理 | 适合需要保持会话一致性的场景 | 电商监控、账号管理 |
| 隧道代理 | 自动更换IP,适合长期运行的任务 | 长期数据采集任务 |
Q5: 爬虫被封了如何解封?
- 等待封禁过期(临时封禁通常1小时-24小时)
- 联系网站管理员申请解封
- 更换IP重新开始
五、总结
爬虫防封的核心是「模拟真实用户」。通过代理IP轮换、控制请求频率、设置合理的请求头,可以有效规避大部分反爬机制。选择高质量的代理服务(如悟空代理),配合本文的代码示例,你就能构建一个稳定、高效的爬虫系统。
本文由悟空代理内容团队出品,转载需授权。
