首页> 代理IP资讯 >爬虫探索

Python 爬虫免费代理 IP 怎么用?requests 库实操教程,代码直接跑

IP分享菌 2026-03-03 10:20:33

昨天写的爬虫脚本又被封 IP 了 —— 连续爬取某电商平台商品数据不到 10 分钟,就收到了 403 Forbidden 响应,本地 IP 直接被目标网站拉黑。做爬虫开发的应该都懂这种痛:没有代理 IP,爬虫就是 “一次性用品”,爬取稍多数据就会被风控系统识别并封禁。

其实解决这个问题的核心就是给爬虫加一层 “伪装”,用代理 IP 代替本地 IP 发起请求。今天我就结合自己的实战经验,分享一套用 Python 的 requests 库对接免费代理 IP 的方法,从代理验证到异常处理,可以直接落地使用。

一、先搞懂:代理 IP 的基本使用逻辑

在写代码前,先理清核心逻辑:正常情况下,requests 直接用本地 IP 发请求;加代理后,请求会先发送到代理服务器,再由代理服务器转发给目标网站,目标网站只能看到代理 IP,无法识别你的真实 IP。

免费代理 IP 的格式通常是http://IP地址:端口号(如http://112.114.34.23:8080),requests 库代理 IP的核心,就是通过proxies参数传入配置。

二、实操第一步:验证单个免费代理 IP 是否可用

免费代理 IP最大的问题就是存活率极低,随便复制过来的十有八九不能用。所以我们第一步必须写一个Python 代理 IP 验证函数,先过滤掉无效代理。

1. 完整验证代码

python
import requests
from requests.exceptions import ConnectTimeout, ConnectionError, ProxyError

def check_proxy(proxy):
    """
    验证单个免费代理IP是否可用
    :param proxy: 代理IP,格式如 "http://112.114.34.23:8080"
    :return: 可用返回True,不可用返回False
    """
    test_url = "https://www.baidu.com"
    timeout = 3
    
    proxies = {
        "http": proxy,
        "https": proxy
    }
    
    try:
        response = requests.get(
            test_url,
            proxies=proxies,
            timeout=timeout,
            allow_redirects=False
        )
        if response.status_code == 200:
            print(f"代理可用:{proxy}")
            return True
        else:
            print(f"代理无效:{proxy}")
            return False
    except (ConnectTimeout, ConnectionError, ProxyError):
        print(f"代理连接失败:{proxy}")
        return False
    except Exception as e:
        print(f"代理验证出错:{proxy}")
        return False

if __name__ == "__main__":
    test_proxy = "http://112.114.34.23:8080"
    check_proxy(test_proxy)

2. 关键点说明

proxies要同时写http和https,否则协议不匹配会直接走本地 IP。

免费代理普遍慢、不稳定,超时建议设 3 秒以上。

异常捕获是爬虫代理异常处理的关键,能防止程序直接崩掉。

三、实操第二步:批量筛选可用代理 IP

实际爬数据时,我们不可能只用一个代理。下面是一套可直接用的批量验证 + 代理池筛选逻辑。

python
import requests
from requests.exceptions import ConnectTimeout, ConnectionError, ProxyError

def check_proxy(proxy):
    test_url = "https://www.baidu.com"
    timeout = 3
    proxies = {"http": proxy, "https": proxy}
    try:
        response = requests.get(test_url, proxies=proxies, timeout=timeout, allow_redirects=False)
        return response.status_code == 200
    except:
        return False

def get_usable_proxies(proxy_list):
    usable_proxies = []
    for proxy in proxy_list:
        if check_proxy(proxy):
            usable_proxies.append(proxy)
    return usable_proxies

def crawl_with_proxy(target_url, usable_proxies):
    if not usable_proxies:
        print("无可用代理,终止爬取")
        return
    
    for proxy in usable_proxies:
        proxies = {"http": proxy, "https": proxy}
        try:
            response = requests.get(
                target_url,
                proxies=proxies,
                timeout=5,
                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"
                }
            )
            print(f"使用代理 {proxy} 爬取成功")
            return response.text
        except Exception as e:
            print(f"代理 {proxy} 爬取失败:{str(e)}")
            continue
    
    print("所有代理均失效,爬取失败")
    return None

if __name__ == "__main__":
    proxy_list = [
        "http://112.114.34.23:8080",
        "http://192.168.1.1:80",
        "http://220.181.57.195:8080"
    ]
    usable_proxies = get_usable_proxies(proxy_list)
    print("可用代理:", usable_proxies)
    
    target_url = "https://www.example.com"
    crawl_with_proxy(target_url, usable_proxies)

四、实操避坑:免费代理 IP 的核心注意事项

1.避免高频请求

即使加了代理,短时间内高频访问依然会被封,建议加time.sleep(1)控制频率。

2.代理协议要匹配

目标是https就必须用支持 https 的代理,否则会报错。

3.动态更新代理池

免费代理存活时间很短,爬取过程中要定时重新验证、替换失效 IP。

4.合法合规爬取

仅用于公开数据学习,不用于非法采集。

五、进阶优化:自动获取免费代理 IP

手动找代理太麻烦,这里给你一套直接从66 免费代理 IP接口获取的代码,拿来就能跑。

python
import requests
import re

def get_free_proxies():
    """66免费代理API获取"""
    proxy_url = "https://www.66daili.com/get-ip/"
    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",
        "Referer": "https://www.66daili.com/"
    }
    
    try:
        response = requests.get(proxy_url, headers=headers, timeout=10)
        response.encoding = "utf-8"
        
        proxy_pattern = re.compile(r'\d+\.\d+\.\d+\.\d+:\d+')
        proxy_matches = proxy_pattern.findall(response.text)
        
        proxies = [f"http://{p}" for p in proxy_matches]
        return proxies
    except Exception as e:
        print("获取免费代理失败:", str(e))
        return []

if __name__ == "__main__":
    free_proxies = get_free_proxies()
    print("获取到免费代理:", free_proxies[:5])

总结

这篇免费代理 IP 使用教程,从Python 爬虫免费代理 IP基础用法,到requests 库代理 IP配置、Python 代理 IP 验证、爬虫代理异常处理,再到自动获取66 免费代理 IP,全是实战可直接运行的代码。

免费代理适合学习、小批量测试;如果是正式项目、高并发稳定爬取,还是建议使用付费代理池,效率和稳定性会提升一个档次。