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}")
代码解释:
- 核心是
urllib3.util.retry.Retry和requests.adapters.HTTPAdapter。它们为requests.Session提供了底层的连接池和重试逻辑。 create_session_with_retries函数封装了创建会话的逻辑。你可以调整retries(重试次数)、backoff_factor(失败后等待时间递增的因子)等参数。session.get(url, timeout=(5, 15))中的timeout参数至关重要。它接收一个元组,第一个是连接超时,第二个是读取超时。这能防止请求无限期挂起。- 使用
try...except块捕获各种请求异常,便于进行错误处理。
其他关键点:
- 设置请求头:有些服务器会拒绝没有常见浏览器头部的请求。在
session.get()前添加session.headers.update({'User-Agent': '你的浏览器UA'})。 - 降低请求频率:在循环中请求时,使用
time.sleep()在请求间暂停,减轻服务器压力。 - 检查目标网站:确认网站是否可以正常访问,以及是否有反爬机制(如验证码)导致连接被重置。
总结:用重试会话加合理超时是解决这类问题的标准做法。
#1 cookies 是手动在 web 页面抓的。。
哈哈哈哈终身代号 9527
如果可以的话改成用代码获取呗……
大约一周, 那就是 Cookie 生命周期只有一周?? 重新登录不就行了.
#6 重新登录比较麻烦
服务端过期基本没办法
换个思路,手机端一般会有类似延长 token 的机制


