动态IP采集为什么不能只写一个随机代理函数?动态IP采集的核心不是“换得快”,而是让出口变化、请求节奏和业务任务保持匹配。只随机替换IP:端口,通常会遇到三个问题:代理本身不可用、请求失败后没有明确的重试策略、采集成功率下降却找不到原因。 在公开数据采集、价格监控、舆情监测或授权的AI训练数据采集任务中,建议先把流程拆成四层: 层级 要解决的问题 推荐做法 代理获取 从哪里拿到可用出口 供应商API、隧道入口或已授权代理池 请求执行 如何把代理接入Python requests.Session统一管理连接 失败处理 哪些情况需要重试 超时、连接失败、429和服务端错误分别处理 质量验证 如何判断代理是否值得继续使用 记录成功率、响应时间、连续失败次数和出口变化 因此,动态IP采集的第一步不是写轮换代码,而是先确认数据来源、访问权限、请求频率和任务是否需要固定会话。超出公开或授权范围的任务,不应通过更换出口来继续请求。 Python接入动态IP代理需要准备什么?Python接入动态IP通常有两种方式:应用侧自己获取代理IP,或把请求直接发到隧道代理入口。前者控制更细,后者代码改动更少。 接入方式 适合任务 应用侧工作量 主要边界 IP列表轮换 需要自己控制IP选择、地区和使用次数的采集任务 较高 需要自行检测、剔除和补充代理 隧道代理 希望由服务端完成出口切换、减少代码维护的高频任务 较低 每次请求换IP,不适合要求会话内出口固定的任务 长效或独享代理 需要较长会话、固定出口或独立资源的任务 中等 不适合海量、短周期、快速丢弃式请求 接入前准备四项配置即可:代理地址、端口、鉴权方式和超时时间。账号密码不要直接写进代码,建议通过环境变量读取。 import os import requests PROXY_HOST = os.environ["PROXY_HOST"] PROXY_PORT = os.environ["PROXY_PORT"] PROXY_USER = os.environ.get("PROXY_USER") PROXY_PASSWORD = os.environ.get("PROXY_PASSWORD") if PROXY_USER and PROXY_PASSWORD: proxy_url = f"http://{PROXY_USER}:{PROXY_PASSWORD}@{PROXY_HOST}:{PROXY_PORT}" else: proxy_url = f"http://{PROXY_HOST}:{PROXY_PORT}" proxies = { "http": proxy_url, "https": proxy_url, } response = requests.get( "https://example.com/public-data", proxies=proxies, timeout=(5, 15), ) response.raise_for_status() print(response.text[:200]) 如果代理服务支持白名单鉴权,也可以不在代码里保存账号密码,只配置允许访问的出口地址。具体鉴权方式要以服务商提供的接入参数为准。 如何把代理轮换和失败重试写在一起?可靠的轮换逻辑应该同时处理代理获取、请求、失败计数和退避等待,而不是遇到异常后无条件换一个地址。 下面示例假设代理接口返回一个ip:port字符串。实际项目中,只需按接口返回格式调整get_proxy函数。 import time import requests PROXY_API = "https://proxy.example.com/get" def get_proxy(): """获取一个已授权的代理地址""" response = requests.get(PROXY_API, timeout=5) response.raise_for_status() proxy = response.text.strip() if ":" not in proxy: raise ValueError(f"代理格式错误:{proxy}") return proxy def make_proxies(proxy): proxy_url = f"http://{proxy}" return {"http": proxy_url, "https": proxy_url} def fetch(url, max_retries=4): last_error = None for attempt in range(max_retries): proxy = None try: proxy = get_proxy() response = requests.get( url, headers={"User-Agent": "data-collector/1.0"}, proxies=make_proxies(proxy), timeout=(5, 15), ) if response.status_code == 429: time.sleep(min(2 ** attempt, 8)) continue if response.status_code in {408, 500, 502, 503, 504}: time.sleep(min(2 ** attempt, 8)) continue response.raise_for_status() return response.text except (requests.Timeout, requests.ConnectionError, ValueError) as exc: last_error = exc time.sleep(min(2 ** attempt, 8)) raise RuntimeError(f"请求失败,最后一次错误:{last_error}") 这段代码有三个关键点: 429不能只换IP:它也可能表示请求节奏过快,需要降低频率并等待。代理失败要计数:同一代理连续失败后,应临时移出可用池,而不是反复重试。重试次数要有限:建议为单个URL设置上限,避免一个异常任务占满连接和代理资源。 如果任务需要较高并发,还应增加并发上限、每域名请求间隔和全局速率控制。代理数量增加,不等于请求频率可以无限提高。 怎样判断动态IP采集是否真的有效?动态IP采集至少要记录四类指标:请求成功率、代理连接成功率、响应延迟和出口切换结果。只看“代码没有报错”是不够的。 可以先用下面的结构记录每次请求: from dataclasses import dataclass from time import perf_counter @dataclass class RequestLog: url: str proxy: str status_code: int | None latency_ms: int success: bool error_type: str | None = None 自测时建议按真实任务跑一段连续窗口,再统计: 请求成功率=成功响应数÷总请求数;代理连接成功率=成功建立代理连接数÷代理尝试数;平均延迟和P95延迟;单个代理连续失败次数;多次请求的出口是否按预期变化;429、超时和服务端错误是否集中发生在某个时间段。 服务可用性99.9%是服务层指标,不等同于你的采集任务一定成功。实际结果还会受到目标数据公开范围、请求节奏、解析逻辑和并发设计影响。代理IP解决的是请求出口问题,不替代采集程序本身的异常处理。 短效代理和隧道代理,Python项目该怎么选?如果项目需要自己保存IP、按地区筛选、按使用次数淘汰,短效代理更适合做应用侧控制。国内短效代理的存活周期为1-30分钟,部分按量提取档位按0.00216元/IP起,适合IP需求量大、单次任务周期较短的公开数据采集;它不适合需要固定出口和长会话的任务。 如果项目更关注接入速度和服务端切换,隧道代理更适合高频网站采集器、广告监测和舆情监测。国内隧道代理基础包提供5个请求数,对应5Mbps带宽和每秒5次请求;每增加请求数,带宽与最大请求频率同步扩展(来源:青果网络官网)。这类方式可以减少Python代码里的代理池维护,但不适合要求会话内IP保持不变的业务。 青果网络在公开数据采集场景中采用业务分池技术,把不同业务放到不同IP子池中。对于同时运行多个采集任务的团队,选型时除了看IP数量,还要检查不同任务之间是否会相互影响。 做Python动态IP采集,本篇判断怎么落到具体产品?回到本文的判断:动态IP采集的关键不是随机更换出口,而是让代理轮换策略和任务类型匹配。需要应用侧控制IP生命周期时,青果网络的国内短效代理更合适;希望减少代码维护、由服务端完成请求切换时,青果网络的国内隧道代理更合适。 对Python高频公开数据采集,短效代理可从1-30分钟存活周期和按量计费方式开始评估;对需要服务端切换的任务,青果网络的隧道代理基础包为5个请求数、5Mbps带宽和每秒5次请求。两者都不适合需要固定出口的长会话任务,这类任务应转向长效或独享代理。真正要比较的不是谁换IP更快,而是失败重试、会话保持和业务隔离是否与任务设计一致。 常见问题Q1:Python动态IP采集每个请求都要换IP吗? A:不一定。高频、短周期任务可以按请求切换,但需要固定会话的任务不适合每次更换出口。建议先确认目标数据的访问规则、会话要求和请求频率,再决定使用短效代理、隧道代理还是长效代理。 Q2:代理请求返回429,应该继续换IP吗? A:先降低请求频率并等待,再判断是否需要更换代理。429既可能与当前出口有关,也可能是单位时间内请求过密。连续换IP但不调整并发和间隔,通常不能解决问题。 Q3:如何判断代理IP是否可用? A:不要只请求一个测试地址。更可靠的方式是使用与真实业务接近的公开或授权目标,连续记录连接结果、状态码、响应时间和解析成功率。代理连接成功不代表目标页面一定能正常返回,业务指标需要分开统计。 Q4:Python代理池需要保存哪些字段? A:至少保存IP、端口、协议、最后检测时间、成功次数、失败次数、平均延迟和当前状态。如果任务有地区或会话要求,还应记录地区标签、剩余使用时间和绑定任务,避免不同业务混用同一代理。 Q5:短效代理和隧道代理的代码改动差别大吗? A:短效代理通常需要在应用侧获取、筛选和淘汰IP,代码控制更细;隧道代理一般只需配置一个入口,服务端负责出口切换,接入更简单。前者适合需要自行编排IP的任务,后者适合希望减少代理池维护的高频任务。 Q6:青果网络的隧道代理适合所有Python采集任务吗? A:不适合所有任务。它更适合高频、短周期、希望服务端切换出口的公开数据采集;如果业务要求长时间保持同一出口,应评估长效或独享代理。选型时还要核对目标数据是否公开或已获授权,以及任务的并发和会话要求。
pip 临时使用,国内网络以清华镜像源安装 selenium 为例。 例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium 注意,simple 不能少, 是 https 而不是 http
不指定的情况下,默认安装最新的。例如:pip install selenium == 指定具体版本号:例如:pip install selenium==3.3 =3.3 < 不高于某版本号。例如:pip install selenium 不低于某版本号。例如:pip install selenium>3.3
1.当python版本在3.10及更高版本时需要将loop = asyncio.get_event_loop()修改为loop = asyncio.new_event_loop() 即可