Python批量下载Excel中PDF链接报错 如何无错保存文件
错误原因
报错的核心诱因是URL列表中存在nan空值:你从Excel读取的Source_URL列存在空单元格,pandas会默认将空单元格转为float类型的nan,dload.save_multi在解析URL时遇到非字符串的float类型值就会抛出解码错误。此外你当前的URL列表存在大量重复值,会导致重复下载相同PDF浪费资源。
修复后的代码
import dload import pandas as pd import requests # 配置请求头,伪装浏览器避免部分网站反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } df = pd.read_excel('examples.xlsx') # 直接从列中提取非空、去重的URL列表 list_urls = df['Source_URL'].dropna().unique().tolist() # 传入headers参数,下载文件 pdfs = dload.save_multi( list_urls, dir='F:/technophile/proj/PDFs/', max_threads=8, tsleep=1, headers=headers ) print(pdfs) print('saved!')
更可控的备选写法(requests单线程遍历,单文件下载失败不影响整体)
如果你需要单独捕获每个URL的下载错误,可以用下面的写法,调试更方便:
import os import pandas as pd import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } save_dir = 'F:/technophile/proj/PDFs/' os.makedirs(save_dir, exist_ok=True) df = pd.read_excel('examples.xlsx') list_urls = df['Source_URL'].dropna().unique().tolist() for url in list_urls: try: # 提取PDF文件名 file_name = url.split('/')[-1] save_path = os.path.join(save_dir, file_name) # 跳过已下载的文件 if os.path.exists(save_path): print(f"{file_name} 已存在,跳过下载") continue # 发送请求下载 resp = requests.get(url, headers=headers, timeout=30) resp.raise_for_status() # 保存文件 with open(save_path, 'wb') as f: f.write(resp.content) print(f"{file_name} 下载完成") except Exception as e: print(f"{url} 下载失败,错误信息:{str(e)}") print('所有下载任务处理完成')
内容的提问来源于stack exchange,提问作者technophile_3
相关产品推荐
相关产品推荐

