Python爬虫遇到Connection aborted错误如何解决?

最近写了一个简单的模拟发送请求的脚本,大约可用一周后就会报出如下错误,当重新抓一下 cookie 时就又好用了,感觉貌似是反爬虫策略?应该如何应对?谢谢。

Traceback (most recent call last):
  File "call.py", line 35, in <module>
    r = requests.post('http://m.01zhuanche.com/touch/order/bookingCar', headers=header, data=book_data).json()
  File "/Library/Python/2.7/site-packages/requests/api.py", line 110, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 596, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/adapters.py", line 473, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('HTTP/1.1 9527 \r\n',))

Python爬虫遇到Connection aborted错误如何解决?

9 回复

try … except … 然后重新获取 Cookies ?


遇到Connection aborted错误,这通常是网络连接不稳定、服务器主动断开或客户端请求超时导致的。核心思路是增加请求的容错性。

最直接有效的方法是使用requests库配合重试机制。这里给你一个完整的代码示例,它设置了连接和读取超时,并集成了自动重试功能。

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

def create_session_with_retries(retries=3, backoff_factor=0.5, status_forcelist=(500, 502, 504)):
    """
    创建一个配置了重试机制的requests Session对象。
    
    参数:
        retries: 最大重试次数。
        backoff_factor: 重试间隔的退避因子。
        status_forcelist: 遇到哪些HTTP状态码会触发重试。
    """
    session = requests.Session()
    
    # 定义重试策略
    retry_strategy = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
        # 尊重服务器的Retry-After头部
        respect_retry_after_header=True
    )
    
    # 为HTTP和HTTPS请求挂载适配器
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount("http://", adapter)
    session.mount("https://", adapter)
    
    return session

# 使用示例
url = "https://example.com"
try:
    # 创建带重试的会话
    session = create_session_with_retries(retries=3)
    
    # 发起请求,并设置合理的超时时间(连接超时,读取超时)
    response = session.get(url, timeout=(5, 15)) # (连接超时5秒,读取超时15秒)
    
    # 检查响应状态
    response.raise_for_status()
    
    # 处理响应内容
    print(response.text[:500]) # 打印前500个字符
    
except requests.exceptions.Timeout:
    print("错误:请求超时,请检查网络或增加超时时间。")
except requests.exceptions.TooManyRedirects:
    print("错误:重定向次数过多。")
except requests.exceptions.RequestException as e:
    print(f"网络请求发生错误: {e}")

代码解释:

  1. 核心是urllib3.util.retry.Retryrequests.adapters.HTTPAdapter。它们为requests.Session提供了底层的连接池和重试逻辑。
  2. create_session_with_retries函数封装了创建会话的逻辑。你可以调整retries(重试次数)、backoff_factor(失败后等待时间递增的因子)等参数。
  3. session.get(url, timeout=(5, 15))中的timeout参数至关重要。它接收一个元组,第一个是连接超时,第二个是读取超时。这能防止请求无限期挂起。
  4. 使用try...except块捕获各种请求异常,便于进行错误处理。

其他关键点:

  • 设置请求头:有些服务器会拒绝没有常见浏览器头部的请求。在session.get()前添加session.headers.update({'User-Agent': '你的浏览器UA'})
  • 降低请求频率:在循环中请求时,使用time.sleep()在请求间暂停,减轻服务器压力。
  • 检查目标网站:确认网站是否可以正常访问,以及是否有反爬机制(如验证码)导致连接被重置。

总结:用重试会话加合理超时是解决这类问题的标准做法。

#1 cookies 是手动在 web 页面抓的。。

哈哈哈哈终身代号 9527

如果可以的话改成用代码获取呗……

登录过期,就模拟登录呗

大约一周, 那就是 Cookie 生命周期只有一周?? 重新登录不就行了.

#6 重新登录比较麻烦

服务端过期基本没办法
换个思路,手机端一般会有类似延长 token 的机制

回到顶部