You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:09:03