使用Python同时运行多个脚本处理批量链接下载任务的高效方案
批量链接下载高效实现方案
你当前手动拆分文件、编写多份脚本的方案扩展性极差,完全可以用更简洁的方式实现,核心思路是把并发逻辑内置到单脚本中,无需手动拆分任务:
方案1:单脚本多线程并发(最推荐,IO密集型场景适配)
下载任务属于典型的IO密集型操作,用多线程即可充分利用带宽,不需要开多个终端、多份脚本:
import pandas as pd import requests from concurrent.futures import ThreadPoolExecutor # 自定义配置:最大并发数、CSV路径、结果存储路径 MAX_WORKERS = 4 CSV_PATH = "your_links.csv" RESULT_PATH = "output.csv" def download_link_info(link): # 单个链接的处理逻辑,可替换为自己的实现 try: resp = requests.get(link, timeout=10) # 此处添加自己的信息解析逻辑 return {"link": link, "status": resp.status_code, "content": resp.text[:100]} except Exception as e: return {"link": link, "status": "failed", "error": str(e)} if __name__ == "__main__": # 一次性读入所有链接 df = pd.read_csv(CSV_PATH, header=None) all_links = df[0].tolist() # 多线程并发处理 with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: results = list(executor.map(download_link_info, all_links)) # 结果存储 pd.DataFrame(results).to_csv(RESULT_PATH, index=False)
你需要调整并发数的时候,只要修改MAX_WORKERS参数即可,哪怕处理百万行数据也不需要改动其他逻辑。
方案2:单脚本分片执行(适合需要分开跑分片的场景)
如果你确实需要把任务拆分到不同终端执行(比如避免单进程挂了全量重跑),也不需要写多份脚本,只要给脚本加命令行参数指定分片规则即可:
import pandas as pd import argparse # 接收命令行参数 parser = argparse.ArgumentParser() parser.add_argument("--total-shards", type=int, required=True, help="总分片数") parser.add_argument("--shard-id", type=int, required=True, help="当前执行的分片ID,从0开始") args = parser.parse_args() if __name__ == "__main__": df = pd.read_csv("your_links.csv", header=None) all_links = df[0].tolist() # 自动取当前分片对应的链接 shard_links = all_links[args.shard_id::args.total_shards] # 此处添加自己的处理逻辑 for link in shard_links: # 处理链接 pass
执行时只需要在不同终端传入不同分片参数即可,比如分4片跑的时候:
# 终端1跑第1分片 python download.py --total-shards 4 --shard-id 0 # 终端2跑第2分片 python download.py --total-shards 4 --shard-id 1 # 以此类推
后续要分50片跑百万行数据,只要修改--total-shards参数即可,不需要修改脚本代码。
实用优化建议
- 加断点续跑逻辑:把已经处理完成的链接存入单独的日志文件,每次启动脚本先过滤已完成的链接,中途崩溃重启不需要重跑全量数据
- 加异常捕获:单个链接处理失败不要中断整个脚本,把失败链接存入单独的失败列表,后续单独重跑
- 控制请求速率:如果目标网站有反爬限制,可以给单个请求加固定延迟,避免被封IP
内容的提问来源于stack exchange,提问作者Eleanor Abernathy
相关产品推荐
相关产品推荐

