写这篇内容前,我特意先百度查了下自己的本机IP:113.57.xx.xx。接着随手跑了十秒爬虫,再刷新百度页面,直接弹出提示:您的访问频率异常,请稍后再试。
不用多想,我的IP直接被封禁了。
做爬虫的应该都懂这种无奈:哪怕你的代码写得再工整、逻辑再完美,只要对方网站运维稍微懂点技术,几秒内就能察觉同一个IP在疯狂发起请求,反手一个403封禁,直接让爬虫彻底罢工。
今天就跟大家好好聊一聊,怎么用免费代理IP破解这个难题。我拿谷德免费代理当实操案例,全程附带能直接复制运行的Python代码,新手也能看懂上手。

IP被封,到底是什么原因?
很多人好奇,网站为啥动不动就封爬虫IP?给大家打个很接地气的比方:
正常人逛菜市场,一天顶多去一次,买两三样东西就走。但要是有人五分钟进出十趟,每次只拿一根葱就立马离开,摊主第一时间就会警惕,一眼看出这人不对劲。
爬虫也是同一个道理。
单个IP在短时间内密集发送大量请求,网站的防护系统瞬间就能识别:这根本不是真人正常浏览,就是机器在批量爬取数据。
想要规避这种封禁,无非两种办法:一是放慢请求频率,二是频繁更换IP。前者效率太低,根本不适合批量采数据;轮换代理IP,才是行业主流且实用的解决方案。
市面上这类免费代理网站有不少,谷德代理、开心代理都属于同一类型。不用我特意推荐具体站点,大家直接搜“免费代理IP”,就能搜到一大堆同类平台,玩法都大同小异。
第一步:抓取代理网站的IP列表
这类免费代理网站的布局都很统一,基本都是表格形式展示:IP地址、端口号、HTTP/HTTPS协议、归属地、响应速度一目了然。
我们只需要用requests请求页面,再通过BeautifulSoup解析网页表格,就能批量提取出可用的代理IP。
下面这段代码,专门适配谷德这类免费代理站点,抓取后直接封装成Requests可直接调用的格式:
import requests
from bs4 import BeautifulSoup
def fetch_proxy_from_page(url):
"""从谷德类的代理页面抓取一批候选IP"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
resp = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, 'html.parser')
# 根据页面实际表格ID调整选择器,通用适配代理站点
rows = soup.select('#ip_list tr')
proxies = []
for row in rows[1:]: # 跳过表格表头
cols = row.find_all('td')
if len(cols) < 3:
continue
ip = cols[0].text.strip()
port = cols[1].text.strip()
protocol = cols[2].text.strip().lower() # 识别http或https协议
proxy = {
protocol: f"{protocol}://{ip}:{port}",
'ip': ip,
'port': port,
'protocol': protocol
}
proxies.append(proxy)
return proxies温馨提醒:爬下来的IP千万别直接拿来用。免费代理有个致命短板——没有任何稳定性保障。可能几分钟前检测还能用,等我们调用的时候就已经失效报废了。
第二步:筛选出真正可用的代理IP
免费代理想要正常使用,必须过三道门槛:能正常连通目标网站、响应速度不能太慢、协议类型和访问站点匹配。
我自己封装了一个简易好用的代理检测函数,一键就能校验IP是否靠谱:
import time
def validate_proxy(proxy, test_url='https://httpbin.org/ip'):
"""
验证代理IP是否可用
proxy: 封装好的代理字典数据
"""
try:
start = time.time()
resp = requests.get(
test_url,
proxies=proxy,
timeout=10
)
elapsed = time.time() - start
if resp.status_code == 200:
# 返回连通状态、响应耗时、返回内容,排查真实IP泄露问题
return True, elapsed, resp.text
else:
return False, elapsed, resp.status_code
except Exception as e:
return False, 0, str(e)测试地址推荐大家用httpbin.org/ip,这个站点会直接返回当前访问的出口IP。我们能清晰看到,用了代理之后,显示的是不是代理服务器IP,有没有泄露自己的真实本机IP。
实测下来能发现一个现状:免费代理里,真正的高匿名IP少之又少,大部分都会泄露真实IP地址,或者暴露请求头信息。这种代理用了也等于白用,所以提前筛选检测,绝对不能省。
只有筛选出来的高匿名、低延迟IP,才是能放心用的优质代理。
第三步:轮流切换IP,别死磕同一个
就算筛选出一批高质量免费代理,也千万别长期固定只用一个。长时间用单个IP,照样大概率被风控封禁。
正确玩法很简单:不要把所有请求都压在同一个IP上。每次发送请求都随机换一个代理,就算某个IP被封,也只影响单次请求,整个爬虫任务还能平稳运行。
给大家写好了一个RotatingProxy代理轮换类,直接当成爬虫专属IP切换器就能用:
import random
import time
import requests
class RotatingProxy:
def __init__(self):
self.proxy_pool = [] # 存放封装好的代理池数据
self.current_index = 0
def update_pool(self, new_proxies):
"""更新代理池,只保留检测通过的可用IP"""
self.proxy_pool = new_proxies
def get_proxy(self):
"""随机从代理池取出一个IP"""
if len(self.proxy_pool) == 0:
return None
return random.choice(self.proxy_pool)
def request_with_proxy(self, url, max_retries=3):
"""自动容错请求:代理失效就自动切换下一个"""
for attempt in range(max_retries):
proxy = self.get_proxy()
if not proxy:
print("代理池已为空!")
return None
try:
resp = requests.get(url, proxies=proxy, timeout=10)
if resp.status_code == 200:
return resp.text
else:
print(f"代理 {proxy} 访问异常,自动跳过")
except Exception as e:
print(f"代理 {proxy} 请求失败,自动跳过:{e}")
return None代码里的random.choice就是核心,每次发起请求都会随机抽取一个IP,比固定单IP安全太多,能大幅降低被封禁概率。
必看!免费代理的这些坑一定要避开
新手刚接触免费代理,一定要提前做好心理预期:这类IP稳定性极差。根据实测统计,超过91%的免费代理存活时间不超过8小时,爬着爬着突然断连、失效都是常态。
解决办法也很简单:写一个定时任务,每隔半小时重新爬取一次代理站点,重新校验筛选,刷新代理池IP;也可以直接用GitHub上成熟的开源代理池项目,不用自己从零开发造轮子,省事又省心。
另外重点提醒一句:免费代理千万别用来操作涉及个人隐私的业务。登录账号、提交敏感表单这类操作,老老实实选用靠谱付费代理,或者自用固定IP,安全第一。
最后提醒:换IP不是万能的
很多人误以为只要换了代理IP,就能高枕无忧,其实不然。
正常人用浏览器访问网站,都会自带固定的UA标识、语言请求头、Cookie等信息。这些细节都是网站分辨真人与爬虫的关键特征。
如果你只换IP,请求头、访问行为全都一成不变,网站照样能轻松判定你是爬虫,甚至直接拉黑整个代理IP段。
真正稳妥的防封思路,一定要打组合拳:轮换代理IP + 随机User-Agent + 设置随机请求延迟 + 控制爬虫并发数。
随机伪造UA可以直接用fake_useragent库,一行ua.random就能自动调用各大浏览器标识,简单又实用;再适当降低单线程并发数量,就能最大程度避开网站风控。
