首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >利用Python爬取可用的代理IP,解决爬虫IP封禁问题

利用Python爬取可用的代理IP,解决爬虫IP封禁问题

原创
作者头像
永不掉线的小白
发布2026-09-01 14:04:03
发布2026-09-01 14:04:03
300
举报

写爬虫最头疼的问题,莫过于本地固定IP频繁请求后被网站封禁。之前踩了不少坑,发现单纯改代码、加延时远远不够,轮换代理IP才是解决IP封禁的核心办法。

免费代理是新手练手、临时爬虫的最优解,就是手动筛选太麻烦。今天就分享一套简洁好用的Python脚本,自动抓取、批量校验代理IP,快速筛选出可用资源,全程实操、干货不啰嗦。

一、爬虫IP为什么会被封禁?

网站反爬系统会精准识别爬虫的异常访问特征,核心检测点就三个:高频重复请求、无合规浏览器请求头、固定机械的访问节奏。单一IP持续高频访问,会被系统直接判定为风险用户,触发拉黑机制,这也是爬虫频繁封IP的根本原因。

规避IP封禁的核心解决方案

想要爬虫稳定运行,只需三套核心操作搭配使用,新手也能快速上手:

1. 伪装浏览器请求:配置正规UA请求头,模拟真实用户访问,绕过基础反爬校验。

2. 轮换代理IP池(核心):用多IP轮换发起请求,避免单一IP暴露,大幅降低封禁概率。

3. 随机延时访问:模拟人工浏览停顿节奏,打破固定请求规律,规避行为风控。

免费代理IP资源选型

市面上多数免费代理失效快、质量差,筛选了一圈,主流免费代理站点资源更新及时、协议齐全,支持HTTP、HTTPS、Socks等主流协议,还标注了延迟、地区信息,非常适合用来做脚本测试。

Python脚本实战:抓取并验证可用代理IP

整套脚本分为抓取、验证两大模块,代码精简无冗余,复制即可直接运行。

1. 环境依赖安装

代码语言:javascript
复制
pip install requests beautifulsoup4

2. 批量抓取代理IP

自动解析代理站点表格数据,批量提取IP和端口,整理为标准代理格式:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

def fetch_proxy():
    url = "https://www.66daili.com/"
    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"
    }
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        resp.encoding = 'utf-8'
        soup = BeautifulSoup(resp.text, 'html.parser')
        proxy_list = []
        rows = soup.select('tr.odd')
        for row in rows:
            cols = row.find_all('td')
            if len(cols) >= 2:
                ip = cols[0].text.strip()
                port = cols[1].text.strip()
                proxy_list.append(f"http://{ip}:{port}")
        return proxy_list
    except Exception as e:
        print(f"代理抓取失败: {e}")
        return []

if __name__ == "__main__":
    proxy_list = fetch_proxy()
    print(f"成功抓取候选代理IP数量:{len(proxy_list)}")
    for p in proxy_list[:5]:
        print(p)

3. 代理可用性批量验证

通过稳定的公共测试接口校验代理有效性,过滤所有失效、超时的IP:

代码语言:javascript
复制
def verify_proxy(proxy, test_url="http://httpbin.org/ip", timeout=5):
    try:
        response = requests.get(
            test_url,
            proxies={"http": proxy, "https": proxy},
            timeout=timeout
        )
        return response.status_code == 200
    except Exception:
        return False

valid_proxies = []
for proxy in proxy_list:
    if verify_proxy(proxy):
        valid_proxies.append(proxy)
        print(f"✓ 可用代理:{proxy}")
    else:
        print(f"✗ 失效代理:{proxy}")

完整整合版脚本(直接运行可用)

整合抓取、校验、防拦截延时逻辑,适配日常学习和小规模爬虫场景:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup
import time

def fetch_proxy():
    url = "https://www.66daili.com/"
    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"}
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        resp.encoding = 'utf-8'
        soup = BeautifulSoup(resp.text, 'html.parser')
        proxy_list = []
        rows = soup.select('tr.odd')
        for row in rows:
            cols = row.find_all('td')
            if len(cols) >= 2:
                ip = cols[0].text.strip()
                port = cols[1].text.strip()
                proxy_list.append(f"http://{ip}:{port}")
        return proxy_list
    except Exception as e:
        print(f"代理抓取失败: {e}")
        return []

def verify_proxy(proxy, test_url="http://httpbin.org/ip", timeout=5):
    try:
        resp = requests.get(test_url, proxies={"http": proxy, "https": proxy}, timeout=timeout)
        return resp.status_code == 200
    except:
        return False

if __name__ == "__main__":
    print("开始抓取免费代理IP...")
    raw_proxies = fetch_proxy()
    print(f"共抓取 {len(raw_proxies)} 个候选代理,开始批量验证...\n")

    available_proxies = []
    for idx, proxy in enumerate(raw_proxies, 1):
        if verify_proxy(proxy):
            available_proxies.append(proxy)
            print(f"[{idx}/{len(raw_proxies)}] ✓ 有效:{proxy}")
        else:
            print(f"[{idx}/{len(raw_proxies)}] ✗ 失效")
        time.sleep(0.5)

    print(f"\n验证完成!筛选出可用代理共 {len(available_proxies)} 个:")
    for valid_proxy in available_proxies:
        print(valid_proxy)

实操避坑心得与建议

分享几个新手必看的实操经验,少走弯路:

1. 免费代理时效性极差,无法长期复用,每次跑爬虫前建议重新抓取校验;

2. 可多整合几个免费代理平台,扩充代理池,提升爬虫稳定性;

3. 免费代理仅适合学习测试,高并发、正式项目建议用付费代理;

4. 严格合规使用代理,仅用于合法技术学习和数据采集。

总结

这套自动化代理脚本,完美适配新手练手和临时爬虫需求,不用手动筛选IP,高效解决IP封禁问题。虽然免费代理稳定性有限,但胜在零成本、易上手,代码逻辑通用,可适配各类免费代理站点。有更好的优化思路,欢迎评论区交流!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、爬虫IP为什么会被封禁?
  • 规避IP封禁的核心解决方案
  • 免费代理IP资源选型
  • Python脚本实战:抓取并验证可用代理IP
    • 1. 环境依赖安装
    • 2. 批量抓取代理IP
    • 3. 代理可用性批量验证
  • 完整整合版脚本(直接运行可用)
  • 实操避坑心得与建议
  • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档