Python网络爬虫如何保存进度,遇到HTTP错误时可从断点继续运行?
Pushshift API批量采集断点续传与错误优化方案
1. 核心解决思路
- 单次请求增加异常捕获与重试逻辑,避免偶发网络错误直接中断整体任务
- 采集进度实时持久化到本地,每次启动自动跳过已完成的采集项,实现断点续跑
2. 具体实现要点
2.1 异常重试配置
对urlopen请求增加10秒超时限制,捕获连接超时、HTTP错误、网络连接错误三类异常,最多重试3次,重试间隔采用指数退避策略(1s/2s/4s),进一步降低429错误触发概率。
2.2 进度持久化逻辑
将已完成采集的标的代码和对应结果实时写入本地JSON文件,脚本每次启动时先读取本地文件中的已完成记录,过滤ticklist中已经采集过的项,仅对未采集的标的发起请求。
3. 优化后代码示例
import json import time from urllib.request import urlopen from urllib.error import URLError, HTTPError # 配置项 PERSIST_FILE = "scraped_result.json" MAX_RETRY = 3 TIMEOUT = 10 # 此处替换为你的实际标的列表 ticklist = ["AAPL", "TSLA", "MSFT"] # 加载已采集进度 try: with open(PERSIST_FILE, "r", encoding="utf-8") as f: scraped_data = json.load(f) except FileNotFoundError: scraped_data = {} # 过滤掉已经采集完成的标的 pending_ticks = [tick for tick in ticklist if tick not in scraped_data] for tick in pending_ticks: retry_count = 0 success = False while retry_count < MAX_RETRY and not success: try: url = f"https://api.pushshift.io/reddit/search/submission/?q={tick}&subreddit=wallstreetbets&metadata=true&size=0&after=1610928000&before=1613088000" f = urlopen(url, timeout=TIMEOUT) j = json.load(f) subs = j['metadata']['total_results'] # 保存结果到字典 scraped_data[tick] = subs # 实时写入本地文件持久化 with open(PERSIST_FILE, "w", encoding="utf-8") as f: json.dump(scraped_data, f, ensure_ascii=False, indent=2) print(f'{tick} has been scraped!') success = True time.sleep(1) except (URLError, HTTPError, TimeoutError) as e: retry_count += 1 wait_time = 2 ** retry_count # 指数退避等待 print(f"{tick} 采集失败,错误信息: {str(e)},第{retry_count}次重试,等待{wait_time}秒") time.sleep(wait_time) if not success: print(f"{tick} 已达到最大重试次数,跳过该标的,后续可手动补采") # 最终所有结果可直接从scraped_data中读取,也可从本地文件加载 X = list(scraped_data.values())
4. 补充说明
- 若需要补采跳过的标的,直接删除本地JSON文件中对应标的的记录,重新运行脚本即可
- 若采集量极大,可将持久化存储替换为SQLite等轻量数据库,写入性能更稳定
内容的提问来源于stack exchange,提问作者Nish
相关产品推荐
相关产品推荐

