遍历Python代理字典实现每次请求更换代理的问题
解决Requests每次请求更换代理的问题
Hey Kyle, 我懂你的需求——每次发起GET/POST请求时自动切换不同代理,之前用单个代理没问题,但遍历代理池的时候卡壳了对吧?下面给你几个实用方案,一步步搞定:
第一步:整理你的代理池
首先得确保代理字典能方便迭代。假设你的代理字典是这样的(键是代理标识,值是Requests标准的代理配置):
# 示例代理字典 proxy_pool = { "proxy_usa": {"http": "http://192.168.1.1:8080", "https": "https://192.168.1.1:8080"}, "proxy_uk": {"http": "http://10.0.0.2:3128", "https": "https://10.0.0.2:3128"}, "proxy_jp": {"http": "http://172.16.0.3:8888", "https": "https://172.16.0.3:8888"} }
我们把它转换成列表,方便后续遍历:
proxy_list = list(proxy_pool.values())
方案1:遍历代理池,逐个发起请求
如果你的请求数量和代理数量对应,或者想逐个用完代理池里的每个代理,直接循环遍历就行:
import requests # 要请求的目标URL(单个或多个都可以) target_urls = ["https://httpbin.org/ip", "https://example.com", "https://example.org"] # 遍历代理和URL,每次请求用不同代理 for proxy, url in zip(proxy_list, target_urls): try: # 发起请求时指定当前代理 response = requests.get(url, proxies=proxy, timeout=10) print(f✅ 使用代理 {proxy['http']} 请求 {url} 成功,状态码: {response.status_code}") # 这里可以处理响应内容,比如解析JSON # print(response.json()) except requests.exceptions.RequestException as e: print(f❌ 使用代理 {proxy['http']} 请求 {url} 失败: {str(e)}")
方案2:循环复用代理池(无限切换)
如果你的请求次数比代理数量多,想循环重复使用代理池里的代理,可以用itertools.cycle创建一个无限迭代器:
import requests from itertools import cycle # 创建代理循环迭代器 proxy_cycler = cycle(proxy_list) # 发起10次请求,每次自动切换下一个代理 for _ in range(10): current_proxy = next(proxy_cycler) try: resp = requests.get("https://httpbin.org/ip", proxies=current_proxy, timeout=8) print(f当前代理: {current_proxy['http']}, 响应返回的IP: {resp.json()['origin']}") except Exception as e: print(f代理 {current_proxy['http']} 失效,跳过: {str(e)}")
关键注意事项
- 代理格式正确性:确保http和https的代理地址对应,有的代理只支持http协议,用于https请求会失败;如果代理需要认证,格式是
http://username:password@proxy_ip:port。 - 添加超时时间:一定要给请求加上
timeout参数,避免某个失效代理卡住整个程序。 - 异常处理:代理很容易失效,通过异常捕获可以跳过失效代理,保证程序继续运行。
- 代理有效性校验:如果需要更严谨的方案,可以在使用前先校验代理是否可用(比如请求httpbin.org/ip看是否能正常返回)。
这样应该就能满足你每次请求更换代理的需求了,要是还有其他细节问题,随时说!
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

