Python爬虫如何从代理列表中快速筛选可用功能性代理
快速从免费代理列表筛选可用代理的实现方案
你当前脚本运行慢的核心原因是把代理有效性校验的流程嵌在了正式爬取链路里,串行试错+10秒长超时+随机取代理的组合,会把大量时间浪费在等待无效代理超时上,用下面几个方法可以把代理筛选速度提升几十倍:
- 前置并发校验,不要边爬边试
拿到爬取到的原始代理列表后,不要直接在爬取业务逻辑里挨个试错,先单独做一轮预校验:- 校验地址直接用你要爬的目标站域名,不要用其他通用站点——很多免费代理能连通公网,但早就被YellowPages封禁,测了也没法用
- 校验超时设为3-5秒即可,比你当前设置的10秒超时缩短一半等待时间
- 用多线程/协程并发检测,不要串行挨个测,50个并发下检测100个代理总耗时只取决于最慢的那一个有效代理的响应时间,通常10秒内就能筛完所有代理
核心校验代码参考:
from concurrent.futures import ThreadPoolExecutor, as_completed TEST_TARGET = "https://www.yellowpages.com" CHECK_TIMEOUT = 5 def check_single_proxy(proxy): try: resp = requests.get(TEST_TARGET, headers=headers, proxies=proxy, timeout=CHECK_TIMEOUT) if resp.status_code == 200: # 返回代理和响应耗时,后续用于优先级排序 return (proxy, resp.elapsed.total_seconds()) except Exception: return None def filter_valid_proxies(raw_proxy_list, concurrency=50): valid_res = [] with ThreadPoolExecutor(max_workers=concurrency) as pool: task_list = [pool.submit(check_single_proxy, p) for p in raw_proxy_list] for task in as_completed(task_list): res = task.result() if res: valid_res.append(res) # 按响应速度从快到慢排序,优先用速度快的代理 valid_res.sort(key=lambda x: x[1]) return [item[0] for item in valid_res] - 代理抓取阶段提前过滤低质量代理
你当前从sslproxies爬代理的时候只取了IP和端口,漏掉了两个关键筛选维度:- 优先选标记为
elite proxy(高匿)、支持HTTPS的代理,透明代理、不支持HTTPS的代理90%以上会被目标站拦截,直接跳过不用参与检测 - 抓取时直接过滤掉列表里标注为上次成功响应超过10秒的代理,这类代理就算能用速度也极慢,没必要浪费资源检测
- 优先选标记为
- 优化代理取用逻辑,避免随机试错
- 不要用全局变量只存单个当前代理,预校验完的有效代理按速度排序存成队列,当前代理失效后直接取队列里下一个,不要随机pop——随机取很容易又拿到还没校验的无效代理
- 加个轻量的后台更新逻辑,每隔10分钟自动爬一批新代理、做校验、补充到代理队列里,避免代理全部失效后爬取流程卡住
- 免费代理的固有局限性说明
公开免费代理的整体可用率通常在5%-15%区间,大部分代理要么连不上、要么被目标站封禁、要么速度极慢,并发预校验已经是筛选免费代理最快的方式,没法做到100%代理可用,如果需要稳定爬取还是需要付费代理兜底。
你可以直接把主函数里的代理初始化逻辑改成先调用filter_valid_proxies拿到可用代理列表再启动爬取,整体速度会有非常明显的提升。
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

