爬虫总被封IP?手把手教你用免费代理IP轻松绕过限制,附可直接运行代码

谷德IP代理 2026-05-08 11:27:27

写这篇内容前,我特意先百度查了下自己的本机IP:113.57.xx.xx。接着随手跑了十秒爬虫,再刷新百度页面,直接弹出提示:您的访问频率异常,请稍后再试

不用多想,我的IP直接被封禁了。

做爬虫的应该都懂这种无奈:哪怕你的代码写得再工整、逻辑再完美,只要对方网站运维稍微懂点技术,几秒内就能察觉同一个IP在疯狂发起请求,反手一个403封禁,直接让爬虫彻底罢工。

今天就跟大家好好聊一聊,怎么用免费代理IP破解这个难题。我拿谷德免费代理当实操案例,全程附带能直接复制运行的Python代码,新手也能看懂上手。

爬虫总被封IP?手把手教你用免费代理IP轻松绕过限制,附可直接运行代码

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就能自动调用各大浏览器标识,简单又实用;再适当降低单线程并发数量,就能最大程度避开网站风控。