数据采集时出现Connection Error,如何实现断连重连续采?
解决爬虫ConnectionError断点重试问题
这个问题我爬取大批量页面时太熟悉了!出现ConnectionError: ('Connection aborted.', OSError("(10054, 'WSAECONNRESET')"))通常有两种原因:要么是目标网站的反爬机制检测到频繁请求,主动断开了连接;要么是网络波动导致连接意外重置。咱们可以通过异常捕获+本地重试+断点续爬的思路来解决,直接上修改后的代码和解释:
基础实现:异常捕获+重试机制
import requests from bs4 import BeautifulSoup import time url = "https://www.example.com" # 可配置的重试参数 MAX_RETRIES = 3 # 单个页面最大重试次数 WAIT_SECONDS = 5 # 每次重试前等待的秒数 for page in range(0, 951, 50): new_url = url + str(page) + "&pagingSize=50" is_success = False retry_count = 0 # 循环重试当前页面,直到成功或达到最大重试次数 while not is_success and retry_count < MAX_RETRIES: try: # 发送请求,这里建议加上请求头模拟浏览器,减少被拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } r = requests.get(new_url, headers=headers) # 检查HTTP状态码,非200直接抛出异常 r.raise_for_status() # 解析页面 source = BeautifulSoup(r.content, "html.parser") content = source.select('tr.searchResultsItem:not(.nativeAd, .classicNativeAd)') print(content) # 标记当前页面爬取成功,进入下一页 is_success = True except requests.exceptions.ConnectionError as e: retry_count += 1 print(f"页面 {page} 连接出错!第 {retry_count} 次重试,等待 {WAIT_SECONDS} 秒...") print(f"错误详情: {e}") time.sleep(WAIT_SECONDS) except requests.exceptions.HTTPError as e: print(f"页面 {page} HTTP错误: {e}") # 如果是403/429这类反爬状态码,延长等待时间后跳过 time.sleep(WAIT_SECONDS * 2) break # 如果重试多次仍失败,记录并跳过 if not is_success: print(f"页面 {page} 重试 {MAX_RETRIES} 次仍失败,已跳过")
关键细节解释
- 重试逻辑:用
while循环针对单个页面做重试,避免因为一次网络波动就中断整个爬取任务 - 异常分类处理:区分
ConnectionError(连接问题)和HTTPError(状态码问题),分别处理 - 请求头模拟:加上
User-Agent伪装成浏览器,很多网站会拦截无请求头的爬虫 - 失败兜底:如果重试多次都失败,直接跳过当前页面,保证后续页面能继续爬取
进阶优化建议
如果想让爬虫更稳定,还可以加这些功能:
- 随机等待时间:用
random.randint(3, 8)替代固定的WAIT_SECONDS,避免固定请求间隔被反爬识别 - 代理IP池:如果网站封了你的IP,用代理IP轮换请求
- 断点续爬记录:把已经爬取成功的页码保存到本地文件,下次启动时从最后成功的页码开始,不用从头爬
- 数据持久化:把爬取到的
content保存到CSV/数据库,避免程序崩溃丢失数据
内容的提问来源于stack exchange,提问作者sinan elmas
相关产品推荐
相关产品推荐

