如何使用internetarchive Python库自动取消慢速下载并重新执行?
自动重试internetarchive慢速下载的实现方法
场景说明
使用internetarchive工具下载archive.org资源(例如meetingbank-alameda)时,部分文件会出现下载速度异常缓慢的情况,手动终止并重新执行ia download meetingbank-alameda后,通常能恢复正常速度。以下是两种自动检测慢速下载并重试的实现方案:
方案一:Bash脚本(适用于Linux/macOS)
通过脚本循环执行下载命令,结合进程监控和速度检测,当下载速度低于设定阈值时自动重启任务。
- 首先安装
pv工具(用于监控流量速度):
sudo apt install pv # Debian/Ubuntu # 或 brew install pv # macOS
- 编写脚本
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
- 赋予脚本执行权限并运行:
chmod +x auto_ia_download.sh ./auto_ia_download.sh
方案二:Python脚本(跨平台)
直接调用internetarchive库,自定义下载回调函数实时监控速度,当速度低于阈值时终止当前文件下载并重试。
- 编写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")
- 运行脚本:
python auto_ia_download.py
补充说明
- 两种方案均启用了断点续传(
--resume/resume=True),确保重启后不会重复下载已完成的文件。 - 可根据实际网络情况调整速度阈值、检测间隔等参数,优化重试逻辑。
内容的提问来源于stack exchange,提问作者Franck Dernoncourt
相关产品推荐
相关产品推荐

