免费代理IP采集与筛选:Python自动化获取可用代理

📅 2026/7/11 14:11:50 👁️ 阅读次数 📝 编程学习
免费代理IP采集与筛选:Python自动化获取可用代理

玩爬虫、做数据采集、进行网络测试的时候,免费代理IP绝对是解决IP限流、被封禁问题的神器!但手动找代理、一个个验证有效性真的太费时间了,而且网上大部分免费代理都存在失效、延迟高、匿名性差的问题,踩坑率超高。今天就带大家用Python全自动采集+智能筛选+批量校验免费代理IP,一键搞定可用代理池,全程不用手动操作,新手也能直接跑通!

一、项目能干什么?

  • 自动爬取国内主流免费代理站的HTTP/HTTPS代理IP

  • 智能筛选:自动过滤失效、高延迟、低垃圾匿名代理

  • 批量校验代理可用性,精准留下能直接用的存活代理

  • 自动IP去重,避免重复代理浪费运行资源

  • 输出标准格式代理,直接套用到爬虫、网络请求脚本中

二、简单环境配置

整个项目基于Python3开发,只需要安装三个必备第三方库,打开终端输入下面命令一键安装即可:

pip install requests lxml aiohttp

简单说下每个库的作用,不用深究,安装就完事:

  • requests:用来请求代理网站,抓取原始IP数据

  • lxml:解析网页源码,精准提取IP、端口、代理类型

  • aiohttp:异步批量校验代理,速度比同步快好几倍

三、代理IP自动采集模块

我们本次选用西刺代理、66免费代理两个国内稳定的免费代理平台,针对性适配爬取规则,自动抓取公开的代理数据。

采集逻辑超简单:模拟浏览器访问网站 → 获取网页源码 → 解析提取代理数据 → 初步过滤无效代理。

import requests from lxml import etree import re # 模拟浏览器请求头,防止被网站直接拦截 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" } # 存放原始采集到的代理数据 proxy_list = [] # 1. 西刺代理采集(HTTP/HTTPS) def crawl_xici_proxy(): url = "https://www.xicidaili.com/nn/" try: res = requests.get(url, headers=HEADERS, timeout=10) res.encoding = "utf-8" html = etree.HTML(res.text) # 解析代理表格数据 tr_list = html.xpath("//table[@id='ip_list']//tr[position()>1]") for tr in tr_list: ip = tr.xpath("./td[2]/text()")[0].strip() port = tr.xpath("./td[3]/text()")[0].strip() proxy_type = tr.xpath("./td[6]/text()")[0].strip().upper() # 只保留常用的HTTP/HTTPS代理 if proxy_type in ["HTTP", "HTTPS"]: proxy_list.append({ "ip": ip, "port": port, "type": proxy_type, "proxy": f"{ip}:{port}" }) except Exception as e: print(f"西刺代理采集失败:{str(e)}") # 2. 66免费代理采集(www.66daili.com) def crawl_66_proxy(): url = "http://www.66daili.com/" try: res = requests.get(url, headers=HEADERS, timeout=10) res.encoding = "utf-8" html = etree.HTML(res.text) tr_list = html.xpath("//table//tr[position()>1]") for tr in tr_list: # 适配66代理网页表格字段规则 ip = tr.xpath("./td[1]/text()")[0].strip() port = tr.xpath("./td[2]/text()")[0].strip() proxy_type = tr.xpath("./td[4]/text()")[0].strip().upper() if proxy_type in ["HTTP", "HTTPS"]: proxy_list.append({ "ip": ip, "port": port, "type": proxy_type, "proxy": f"{ip}:{port}" }) except Exception as e: print(f"66免费代理采集失败:{str(e)}") # 批量采集 + 自动去重 def crawl_all_proxy(): crawl_xici_proxy() crawl_66_proxy() # 去除重复的代理IP,避免无效校验 unique_proxy = [] seen = set() for proxy in proxy_list: if proxy["proxy"] not in seen: seen.add(proxy["proxy"]) unique_proxy.append(proxy) print(f"采集完成,去重后原始代理数量:{len(unique_proxy)}") return unique_proxy

四、代理筛选 + 可用性批量校验

刚采集下来的原始代理,大部分都是失效的、延迟超高的,根本没法直接用!这里我们用异步校验的方式,快速筛查出能用的代理,效率拉满。

筛选标准很实用:请求超时不超过5秒、接口请求成功、只保留正规HTTP/HTTPS代理。

import aiohttp import asyncio # 代理超时阈值,可自行调整 TIMEOUT = 5 # 存放最终可用的代理 usable_proxy = [] # 异步校验单个代理是否可用 async def check_proxy(session, proxy_info): proxy = proxy_info["proxy"] proxy_type = proxy_info["type"] # 稳定的公共测试接口 test_url = "http://httpbin.org/get" try: # 通过代理发起请求,验证可用性 async with session.get( url=test_url, proxy=f"{proxy_type.lower()}://{proxy}", timeout=aiohttp.ClientTimeout(total=TIMEOUT) ) as response: if response.status == 200: print(f"可用代理:{proxy}") usable_proxy.append(proxy_info) except Exception: # 超时、连接失败、报错都直接判定为无效代理 pass # 批量并发校验所有代理 async def batch_check_proxy(proxy_data): # 限制并发数,防止电脑卡顿、被网站封禁 async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=100)) as session: tasks = [check_proxy(session, item) for item in proxy_data] await asyncio.gather(*tasks) return usable_proxy # 统一筛选入口 def filter_usable_proxy(): raw_proxy = crawl_all_proxy() asyncio.run(batch_check_proxy(raw_proxy)) print(f"\n筛选完成,可用代理数量:{len(usable_proxy)}") return usable_proxy

五、完整可直接运行代码

给大家整合了全套代码,复制粘贴就能直接运行,一站式完成采集、去重、校验、筛选全过程:

import requests from lxml import etree import aiohttp import asyncio # 全局请求配置 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" } TIMEOUT = 5 proxy_list = [] usable_proxy = [] # 采集模块-西刺代理 def crawl_xici_proxy(): url = "https://www.xicidaili.com/nn/" try: res = requests.get(url, headers=HEADERS, timeout=10) res.encoding = "utf-8" html = etree.HTML(res.text) tr_list = html.xpath("//table[@id='ip_list']//tr[position()>1]") for tr in tr_list: ip = tr.xpath("./td[2]/text()")[0].strip() port = tr.xpath("./td[3]/text()")[0].strip() proxy_type = tr.xpath("./td[6]/text()")[0].strip().upper() if proxy_type in ["HTTP", "HTTPS"]: proxy_list.append({ "ip": ip, "port": port, "type": proxy_type, "proxy": f"{ip}:{port}" }) except Exception as e: print(f"西刺代理采集失败:{str(e)}") # 采集模块-66免费代理 def crawl_66_proxy(): url = "http://www.66daili.com/" try: res = requests.get(url, headers=HEADERS, timeout=10) res.encoding = "utf-8" html = etree.HTML(res.text) tr_list = html.xpath("//table//tr[position()>1]") for tr in tr_list: ip = tr.xpath("./td[1]/text()")[0].strip() port = tr.xpath("./td[2]/text()")[0].strip() proxy_type = tr.xpath("./td[4]/text()")[0].strip().upper() if proxy_type in ["HTTP", "HTTPS"]: proxy_list.append({ "ip": ip, "port": port, "type": proxy_type, "proxy": f"{ip}:{port}" }) except Exception as e: print(f"66免费代理采集失败:{str(e)}") # 采集+去重核心函数 def crawl_all_proxy(): crawl_xici_proxy() crawl_66_proxy() unique_proxy = [] seen = set() for proxy in proxy_list: if proxy["proxy"] not in seen: seen.add(proxy["proxy"]) unique_proxy.append(proxy) print(f"采集完成,去重后原始代理数量:{len(unique_proxy)}") return unique_proxy # 异步校验单个代理 async def check_proxy(session, proxy_info): proxy = proxy_info["proxy"] proxy_type = proxy_info["type"] test_url = "http://httpbin.org/get" try: async with session.get( url=test_url, proxy=f"{proxy_type.lower()}://{proxy}", timeout=aiohttp.ClientTimeout(total=TIMEOUT) ) as response: if response.status == 200: usable_proxy.append(proxy_info) except Exception: pass # 批量校验所有代理 async def batch_check_proxy(proxy_data): async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=100)) as session: tasks = [check_proxy(session, item) for item in proxy_data] await asyncio.gather(*tasks) # 主函数:获取最终可用代理列表 def get_usable_proxies(): raw_proxy = crawl_all_proxy() if not raw_proxy: print("未采集到任何代理IP!") return [] asyncio.run(batch_check_proxy(raw_proxy)) print(f"\n✅ 筛选完成,可用代理总数:{len(usable_proxy)}") # 输出纯代理字符串,直接即用 proxy_str_list = [item["proxy"] for item in usable_proxy] print("可用代理列表:") for p in proxy_str_list: print(p) return proxy_str_list # 程序入口 if __name__ == "__main__": get_usable_proxies()

六、超简单使用教程

1. 直接运行

直接运行整个脚本就行,程序会自动走完「采集→去重→校验→筛选」全部流程,最后直接打印出所有可用的 ip:port 格式代理。

2. 自定义参数微调

  • 超时时间:默认5秒,想要极速代理可以改成3秒,想兼容慢速代理可以调到8秒

  • 并发数量:电脑配置一般的话,把 limit 从100改成50,避免运行卡顿

  • 新增代理源:照着现有代码格式,就能轻松添加其他免费代理网站的采集规则

3. 爬虫项目调用示例

脚本返回的代理列表可以直接用到你的爬虫代码里,随机取用超方便:

proxies_list = get_usable_proxies() # 随机挑选一个代理使用 import random if proxies_list: proxy = random.choice(proxies_list) proxies = { "http": f"http://{proxy}", "https": f"https://{proxy}" } res = requests.get("https://www.baidu.com", proxies=proxies, headers=HEADERS) print(res.status_code)

七、进阶优化小技巧

1. 提升代理存活率

  • 多站点校验:除了httpbin,新增百度等多个测试接口,避免单边可用的虚假代理

  • 定时更新:设置定时任务,定期重新采集筛选,实时更新可用代理池

  • 过滤低匿名代理:新增匿名等级判断,只保留高匿名代理,防止暴露本机真实IP

2. 解决采集被拦截问题

  • 添加随机延时:采集网页时加1-3秒随机等待,避免访问频率太高被网站封禁IP

  • 多源采集:多整合几个代理网站,增加采集基数,可用代理会更多

3. 代理持久化保存

可以把筛选好的可用代理保存到本地TXT文件,不用每次都重新采集校验,随取随用:

# 将可用代理保存到本地txt文件 def save_proxy_to_txt(proxies, path="usable_proxy.txt"): with open(path, "w", encoding="utf-8") as f: for p in proxies: f.write(p + "\n") print(f"代理已保存至 {path}")

八、温馨提示

  • 免费代理的稳定性比较一般,只适合日常测试、轻量数据采集使用,商用场景建议选择付费代理池

  • 部分免费代理会有地域限制、限速情况,批量使用前可以简单二次校验

  • 请合规使用代理IP,仅用于合法网络操作,不要用于违规场景