求助:在不支持通配符的期刊网站批量下载PDF的方法
批量下载期刊PDF的解决方案
方法一:wget结合命令行工具提取链接
你遇到的问题是wget的HTTP协议不支持通配符匹配,得先从XML页面提取所有PDF下载链接,再批量下载:
- 抓取页面内所有PDF链接并保存到文件:
这个命令会把页面中符合格式的PDF链接提取到curl -s https://journals.ametsoc.org/view/journals/mwre/131/5/mwre.131.issue-5.xml | grep -o 'https://journals.ametsoc.org/downloadpdf/view/journals/mwre/131/5/[^"]*\.pdf' > pdf_links.txtpdf_links.txt文件里。 - 用wget批量下载文件:
wget --wait 10 --random-wait --continue -i pdf_links.txt-i参数指定从文件读取链接列表,既避开了通配符的问题,又保留了你设置的等待时间,避免触发反爬机制。
方法二:Python脚本批量下载
如果命令行工具不好用,Python的灵活性更强,还能自定义请求头避免被拦截:
import requests from bs4 import BeautifulSoup import time import random # 目标XML页面URL issue_url = "https://journals.ametsoc.org/view/journals/mwre/131/5/mwre.131.issue-5.xml" # 模拟浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 获取页面内容 response = requests.get(issue_url, headers=headers) response.raise_for_status() # 检查请求是否成功 # 解析XML页面提取PDF链接 soup = BeautifulSoup(response.text, "xml") pdf_links = [] for link in soup.find_all("a", href=True): if link["href"].startswith("https://journals.ametsoc.org/downloadpdf/") and link["href"].endswith(".pdf"): pdf_links.append(link["href"]) # 去重,避免重复下载 pdf_links = list(set(pdf_links)) # 批量下载文件 for idx, link in enumerate(pdf_links, 1): try: filename = link.split('/')[-1] print(f"正在下载第{idx}个文件: {filename}") # 流式下载大文件 pdf_response = requests.get(link, headers=headers, stream=True) pdf_response.raise_for_status() with open(filename, "wb") as f: for chunk in pdf_response.iter_content(chunk_size=8192): f.write(chunk) # 随机延迟8-12秒,降低反爬风险 time.sleep(random.uniform(8, 12)) except Exception as e: print(f"下载{filename}失败: {str(e)}") continue
运行脚本前先安装依赖:pip install requests beautifulsoup4,脚本会自动解析XML里的PDF链接,逐个下载并添加随机延迟。
注意事项
- 不要去掉等待时间,学术期刊网站普遍有反爬机制,频繁请求会临时封禁IP。
- 如果下载失败,可尝试更新请求头或使用代理IP。
内容的提问来源于stack exchange,提问作者Zeinab
相关产品推荐
相关产品推荐

