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

如何使用internetarchive Python库自动取消慢速下载并重新执行?

自动重试internetarchive慢速下载的实现方法

场景说明

使用internetarchive工具下载archive.org资源(例如meetingbank-alameda)时,部分文件会出现下载速度异常缓慢的情况,手动终止并重新执行ia download meetingbank-alameda后,通常能恢复正常速度。以下是两种自动检测慢速下载并重试的实现方案:

方案一:Bash脚本(适用于Linux/macOS)

通过脚本循环执行下载命令,结合进程监控和速度检测,当下载速度低于设定阈值时自动重启任务。

  1. 首先安装pv工具(用于监控流量速度):
sudo apt install pv  # Debian/Ubuntu
# 或
brew install pv      # macOS
  1. 编写脚本auto_ia_download.sh:
#!/bin/bash
ITEM="meetingbank-alameda"
SPEED_THRESHOLD="10"  # 速度阈值(KB/s),低于此值则重启
CHECK_INTERVAL=30      # 每隔30秒检查一次速度

while true; do
    # 启动下载并将输出通过pv监控
    ia download "$ITEM" --resume 2>&1 | pv -tbr > download.log &
    PID=$!

    # 等待下载启动后开始检查
    sleep 60

    while kill -0 $PID 2>/dev/null; do
        # 提取当前下载速度
        CURRENT_SPEED=$(tail -n 10 download.log | grep -oP '\d+\.?\d+KB/s' | tail -n 1 | sed 's/KB/s//')
        # 比较速度与阈值
        if [[ "$CURRENT_SPEED" =~ ^[0-9.]+$ ]]; then
            if (( $(echo "$CURRENT_SPEED < $SPEED_THRESHOLD" | bc -l) )); then
                echo "下载速度过低($CURRENT_SPEED KB/s),重启任务..."
                kill $PID
                wait $PID 2>/dev/null
                break
            fi
        fi
        sleep $CHECK_INTERVAL
    done

    # 检查任务是否正常完成
    if wait $PID 2>/dev/null; then
        echo "下载完成!"
        exit 0
    fi
done
  1. 赋予脚本执行权限并运行:
chmod +x auto_ia_download.sh
./auto_ia_download.sh

方案二:Python脚本(跨平台)

直接调用internetarchive库,自定义下载回调函数实时监控速度,当速度低于阈值时终止当前文件下载并重试。

  1. 编写Python脚本auto_ia_download.py:
import time
from internetarchive import download, get_item

def speed_monitor(chunk, bytes_downloaded, total_bytes, start_time):
    # 计算当前下载速度(KB/s)
    elapsed = time.time() - start_time
    if elapsed < 1:
        return
    current_speed = bytes_downloaded / elapsed / 1024
    speed_threshold = 10  # 速度阈值:10KB/s
    slow_duration_limit = 60  # 持续60秒低于阈值则终止

    # 初始化监控变量
    if not hasattr(speed_monitor, 'slow_start_time'):
        speed_monitor.slow_start_time = None

    if current_speed < speed_threshold:
        if speed_monitor.slow_start_time is None:
            speed_monitor.slow_start_time = time.time()
        elif time.time() - speed_monitor.slow_start_time > slow_duration_limit:
            print(f"文件下载速度过低({current_speed:.2f} KB/s),终止并重试...")
            raise KeyboardInterrupt  # 触发中断,触发库的重试逻辑
    else:
        speed_monitor.slow_start_time = None

def auto_retry_download(item_id):
    item = get_item(item_id)
    while True:
        try:
            # 重置监控状态
            speed_monitor.slow_start_time = None
            download(item_id,
                     callback=lambda c, b, t: speed_monitor(c, b, t, time.time()),
                     resume=True)
            print("所有文件下载完成!")
            break
        except KeyboardInterrupt:
            print("重启下载任务...")
            continue

if __name__ == "__main__":
    auto_retry_download("meetingbank-alameda")
  1. 运行脚本:
python auto_ia_download.py

补充说明

  • 两种方案均启用了断点续传(--resume/resume=True),确保重启后不会重复下载已完成的文件。
  • 可根据实际网络情况调整速度阈值、检测间隔等参数,优化重试逻辑。

内容的提问来源于stack exchange,提问作者Franck Dernoncourt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:02:19