MedResearcher/papers_crawler.py
iomgaa 41e5fd1543 feat: 实现PDF下载功能
- 新增 download_pdfs_from_csv() 方法支持从CSV文件批量下载论文PDF
- 支持ArXiv和MedRxiv两种数据源的PDF链接解析和下载
- 实现并发下载控制、失败重试机制和PDF完整性验证
- 添加实时下载进度显示和详细的错误日志记录
- 更新命令行参数支持PDF下载测试功能
- 清理临时文件和更新.gitignore规则
2025-08-23 19:42:47 +08:00

121 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import argparse
from src.crawler import PaperCrawler
def setup_args():
"""设置命令行参数解析
Returns:
argparse.Namespace: 解析后的命令行参数
"""
parser = argparse.ArgumentParser(
description='论文爬取工具 - 用于批量爬取和处理医学研究论文',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog='''
使用示例:
%(prog)s # 使用默认参数
%(prog)s --paper_website arxiv medrxiv # 指定论文数据源
%(prog)s --parallel 10 # 设置并行度为10
'''
)
parser.add_argument(
'--paper_website',
default=["arxiv","medrxiv"],
help='论文网站 (默认: arxiv,medrxiv)',
nargs='+',
choices=["arxiv","medrxiv"]
)
parser.add_argument(
'--parallel',
type=int,
default=20,
help='并行处理线程数 (默认: 20)'
)
parser.add_argument(
'--csv-download',
type=str,
default=None,
help='指定CSV文件路径'
)
parser.add_argument(
'--pdf_download_list',
type=str,
default='dataset/mimic_papers_20250823.csv',
help='指定PDF下载目录'
)
return parser.parse_args()
def main():
"""主函数 - 执行论文爬取任务"""
try:
# 解析命令行参数
args = setup_args()
# 初始化论文爬取器
crawler = PaperCrawler(
websites=args.paper_website,
parallel=args.parallel
)
print(f"=== 论文爬取工具启动 ===")
print(f"论文数据源: {args.paper_website}")
print(f"并行处理数: {args.parallel}")
print(f"========================")
# 执行论文爬取
if args.csv_download:
print("开始爬取MIMIC-4相关论文...")
papers = crawler.crawl_papers()
if papers:
# 保存到CSV文件
csv_file_path = crawler.save_to_csv(papers)
print(f"\n=== 爬取完成 ===")
print(f"成功爬取: {len(papers)} 篇论文")
print(f"保存位置: {csv_file_path}")
print(f"================")
else:
print("未找到相关论文,请检查网络连接或关键词设置")
# 如果指定了PDF下载测试执行测试
if args.pdf_download_list:
print(f"=== PDF下载功能测试 ===")
print(f"CSV文件: {args.pdf_download_list}")
print(f"并发数: {args.parallel}")
print(f"========================")
# 执行PDF下载
stats = crawler.download_pdfs_from_csv(args.pdf_download_list)
print(f"\n=== PDF下载测试完成 ===")
print(f"总数: {stats['total']} 篇论文")
print(f"成功: {stats['success']} 篇 ({stats['success']/stats['total']*100:.1f}%)")
print(f"失败: {stats['failed']} 篇 ({stats['failed']/stats['total']*100:.1f}%)")
print(f"========================")
return 0
except FileNotFoundError as e:
print(f"错误: 找不到指定的文件 - {e}")
return 1
except ValueError as e:
print(f"错误: 参数值无效 - {e}")
return 1
except Exception as e:
print(f"错误: 程序执行异常 - {e}")
return 1
return 0
if __name__ == "__main__":
exit_code = main()
exit(exit_code)