Python中使用requests测试代理IP失败,如何排查和解决?

ips.csv 是已经保存了形如 118.31.220.3:8080 的 IP 列表
用 requests 测试代理 IP 是否可用输出总是把原 IP 列表又输出了一遍!真心求助!

IPpools = []
with open(‘ips.csv’, ‘r’) as csvfile:
reader = csv.reader(csvfile)
testip = [row[1] for row in reader]

for rows in testip:
proxy = ‘http://’+rows
proxies = {“http”: proxy}
try:
html = requests.get(‘https://www.baidu.com’, proxies=proxies)
if html.status_code == 200:
IPpools.append(proxy)
except Exception as e:
continue

print(IPpools)
Python中使用requests测试代理IP失败,如何排查和解决?


22 回复

proxy = ‘http://’+rows -> proxy = ‘https://’+rows


遇到代理IP测试失败,先别急着换代理,按这个顺序排查:

1. 基础检查

import requests

proxy = {
    'http': 'http://username:password@ip:port',
    'https': 'https://username:password@ip:port'
}

# 测试连接
try:
    resp = requests.get('http://httpbin.org/ip', 
                       proxies=proxy, 
                       timeout=10)
    print(f"代理IP: {resp.json()['origin']}")
except Exception as e:
    print(f"连接失败: {type(e).__name__}: {e}")

2. 常见问题排查点

  • 代理格式:确保是http://https://开头,有密码时格式要对
  • 超时设置:代理响应慢就加timeout参数
  • SSL验证:HTTPS代理可能需要verify=False(仅测试用)
  • 本地代理冲突:检查系统代理设置是否干扰

3. 完整测试脚本

import requests
from requests.exceptions import ProxyError, ConnectTimeout

def test_proxy(proxy_url, test_url='http://httpbin.org/ip'):
    proxies = {
        'http': proxy_url,
        'https': proxy_url.replace('http://', 'https://') 
                if proxy_url.startswith('http://') 
                else proxy_url
    }
    
    try:
        resp = requests.get(test_url, 
                          proxies=proxies, 
                          timeout=15,
                          verify=False)
        
        if resp.status_code == 200:
            actual_ip = resp.json().get('origin', '未知')
            return True, f"成功!当前IP: {actual_ip}"
        else:
            return False, f"HTTP {resp.status_code}"
            
    except ProxyError:
        return False, "代理服务器拒绝连接"
    except ConnectTimeout:
        return False, "连接超时"
    except Exception as e:
        return False, f"其他错误: {type(e).__name__}"

# 使用示例
result, msg = test_proxy('http://user:pass@192.168.1.100:8080')
print(msg)

4. 快速诊断 如果上面的脚本能连httpbin.org但连不了你的目标站,那就是:

  • 目标站封了这个代理IP
  • 需要加请求头(如User-Agent
  • 代理不支持HTTPS网站

一句话建议:先确保代理本身能通,再检查目标站是否屏蔽。

你想表达什么?“原 IP 列表”指的是什么?

请求百度用的 https,proxies = {“http”: proxy} 代理 http,当然不匹配

我的 ip 的列表有 https 和 http,一般怎么处理好?

我的 ip 的列表有 https 和 http,一般怎么处理好?

proxies 我看过文档是怎么写的,就是问数组里的 ip 怎样变成参考里带引号能用的样子

你的 csv 是怎样的?发来看看。

#7 你 5 楼的问题,在 4 楼给出的链接里有答案

就是看过了还不知道怎么解决 才来问的。

直接 proxy=(“all”:row) 换成大括号

#10
4 楼的链接,点进去以后锚点直接定位在这里,结合 3 楼说的思考一下

row 加一下 http 或者 https 协议头

不用管 csv 是怎么样的,我设置读到 python 里就是个数组,就是解决 requests 代理从数组中读取地址,和 https 的问题
http://i4.bvimg.com/653190/d2ca3f32af5b6288.jpg
http://i4.bvimg.com/653190/67387ae897763b8d.jpg

你 csv 里面都没记录代理服务器是 http 还是 https,那没办法处理啊?

我有办法爬到,只是现在没爬

我有办法爬到,只是现在没爬

那你爬的时候把完整 URL 写进 csv 就好了。

骑了一圈儿车回来,楼主是还没找到方法嘛?

试试把 proxies = {“http”: proxy}

改成 proxies = {“http”: proxy, “https”:proxy,} 会怎样 🙄

没错,是要这样子的,我之前单用 http 或 https 也没用,后来改成两都配,就 OK 了

谢谢,已经找到了,只是没回复,我直接用的 proxies = {“all”: proxy} 不知道有没有问题

回到顶部