Python中代理IP使用报错问题如何解决

File “/usr/lib/python3.4/site-packages/urllib3/connectionpool.py”, line 638, in urlopen
339 _stacktrace=sys.exc_info()[2])
340 File “/usr/lib/python3.4/site-packages/urllib3/util/retry.py”, line 367, in increment
341 raise six.reraise(type(error), error, _stacktrace)
342 File “/usr/lib/python3.4/site-packages/urllib3/packages/six.py”, line 685, in reraise
343 raise value.with_traceback(tb)
344 File “/usr/lib/python3.4/site-packages/urllib3/connectionpool.py”, line 600, in urlopen
345 chunked=chunked)
346 File “/usr/lib/python3.4/site-packages/urllib3/connectionpool.py”, line 384, in _make_request
347 six.raise_from(e, None)
348 File “<string>”, line 2, in raise_from
349 File “/usr/lib/python3.4/site-packages/urllib3/connectionpool.py”, line 380, in _make_request
350 httplib_response = conn.getresponse()
351 File “/usr/lib64/python3.4/http/client.py”, line 1227, in getresponse
352 response.begin()
353 File “/usr/lib64/python3.4/http/client.py”, line 386, in begin
354 version, status, reason = self._read_status()
355 File “/usr/lib64/python3.4/http/client.py”, line 356, in _read_status
356 raise BadStatusLine(line)
357 urllib3.exceptions.ProtocolError: (‘Connection aborted.’, BadStatusLine("’’",))
358
359 During handling of the above exception, another exception occurred:
360
361 Traceback (most recent call last):
362 File “/home/shenjianlin/my_project/run.py”, line 56, in <module>
363 run().get_spider()
364 File “/home/shenjianlin/my_project/run.py”, line 18, in get_spider
365 qimingpian().get_id_and_url()
366 File “/home/shenjianlin/my_project/qimingpian_person/qimingpian_person.py”, line 134, in get_id_and_url
367 self.get_agency_content(row_column_list[i -1],row_column_list[i])
368 File “/home/shenjianlin/my_project/qimingpian_person/qimingpian_person.py”, line 304, in get_agency_content
369 self.s.get(news_link, auth=self.auth, proxies=self.proxies).content.decode(“utf-8”)).xpath(
370 File “/usr/lib/python3.4/site-packages/requests/sessions.py”, line 525, in get
371 return self.request(‘GET’, url, **kwargs)
372 File “/usr/lib/python3.4/site-packages/requests/sessions.py”, line 512, in request
373 resp = self.send(prep, **send_kwargs)
374 File “/usr/lib/python3.4/site-packages/requests/sessions.py”, line 622, in send
375 r = adapter.send(request, **kwargs)
376 File “/usr/lib/python3.4/site-packages/requests/adapters.py”, line 495, in send
377 raise ConnectionError(err, request=request)
378 requests.exceptions.ConnectionError: (‘Connection aborted.’, BadStatusLine("’’",))

我在网上看到说 https 请求写成 http 请人看一下这是啥问题,谢谢!
Python中代理IP使用报错问题如何解决


2 回复

代理IP报错通常是因为请求库配置不当或代理本身失效。核心解决思路是正确配置代理参数并添加异常处理。

1. 基础代理配置

import requests

proxies = {
    'http': 'http://user:pass@ip:port',
    'https': 'https://user:pass@ip:port'
}

# 测试代理连通性
try:
    resp = requests.get('http://httpbin.org/ip', 
                       proxies=proxies, 
                       timeout=10)
    print(f'当前IP: {resp.json()["origin"]}')
except requests.exceptions.ProxyError as e:
    print(f'代理连接失败: {e}')
except requests.exceptions.ConnectTimeout:
    print('连接超时,请检查代理服务器状态')

2. 会话保持和重试机制

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
retry_strategy = Retry(
    total=3,
    status_forcelist=[500, 502, 503, 504]
)
session.mount('http://', HTTPAdapter(max_retries=retry_strategy))
session.mount('https://', HTTPAdapter(max_retries=retry_strategy))

# 使用会话
response = session.get('https://api.ipify.org', 
                      proxies=proxies,
                      timeout=(3.05, 27))

3. 常见错误处理

import socks
import socket

# 解决SOCKS代理问题
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket

# 或者使用requests的socks支持
proxies = {'http': 'socks5://user:pass@ip:port',
           'https': 'socks5://user:pass@ip:port'}

4. 代理池实现示例

import random
from typing import List

class ProxyPool:
    def __init__(self, proxies: List[str]):
        self.proxies = proxies
        
    def get_proxy(self) -> dict:
        proxy = random.choice(self.proxies)
        return {
            'http': f'http://{proxy}',
            'https': f'http://{proxy}'  # 注意有些代理http/https相同
        }
    
    def mark_bad(self, proxy: str):
        if proxy in self.proxies:
            self.proxies.remove(proxy)

# 使用示例
pool = ProxyPool(['ip1:port', 'ip2:port', 'ip3:port'])
current_proxy = pool.get_proxy()

关键检查点:

  • 代理格式是否正确(协议://用户:密码@IP:端口)
  • 代理是否需要认证
  • 防火墙是否放行
  • 代理协议匹配(HTTP代理不能用于HTTPS请求)

建议先用免费代理测试基础功能。


所以上一下代码吧……

回到顶部