Haowei Xu
Email: [email protected]
⚠️ 提示:在中国大陆运行该项目时,某些学术资源(如 Google Scholar)可能需要通过 VPN 才能正常访问。请确保您已配置 VPN 以避免网络访问限制。
-
新增
fetch_and_return_json
方法:-
fetch_and_return_json
是一个专门为即时返回 JSON 格式数据而设计的接口,适合需要动态获取数据并进一步处理的场景。 -
方法功能:
- 根据指定的搜索条件抓取论文数据。
- 将抓取到的论文保存到文件,同时直接返回 JSON 格式的结果字符串。
- 如果抓取失败,返回空的 JSON 数组(
[]
)。
-
方法使用示例:
class MyPaperFetcher(AbstractPaperFetcher): def fetch_papers(self, search_params=None, max_results=10): # 示例实现,返回伪造的数据 return [ {"doi": "10.1234/example1", "title": "Sample Paper 1"}, {"doi": "10.1234/example2", "title": "Sample Paper 2"} ] fetcher = MyPaperFetcher(json_file_name="test_papers.json") result_json = fetcher.fetch_and_return_json( search_params={"keyword": "AI", "author": "John Doe"}, max_results=5 ) print(result_json)
-
输出结果示例:
[ { "doi": "10.1234/example1", "title": "Sample Paper 1" }, { "doi": "10.1234/example2", "title": "Sample Paper 2" } ]
-
-
系统退出状态码增强:
main.py
增加了明确的系统退出状态码,用于外部程序判断抓取结果:0
:抓取成功并保存了新论文。1
:抓取成功但未保存新论文(无新数据)。2
:抓取过程中出现错误。
- 退出状态码提供了更灵活的外部调用支持,适合集成到其他任务调度系统或自动化脚本中。
-
新增
test.sh
脚本功能test.sh
是针对 Paper Fetcher 项目的自动化测试脚本,用于验证各功能模块的正确性与稳定性。新版本的test.sh
脚本进行了以下更新:-
动态生成唯一文件名:
- 每次测试中,抓取结果的 JSON 文件名基于时间戳生成,确保每次运行不会覆盖之前的结果。
- 文件名格式:
test_papers_<timestamp>.json
。
-
新增
fetch_and_return_json
方法的测试:- 测试即时返回 JSON 格式结果的功能。
- 验证抓取结果是否正确写入文件,同时返回的 JSON 数据是否符合预期。
-
全面的测试用例覆盖:
- 覆盖多种组合条件(如关键词、作者、期刊、年份等)。
- 增加对
--output_json
和即时返回功能的验证。
-
退出码处理优化:
- 脚本捕获
main.py
的退出状态码,分别处理:0
:抓取成功且有新论文。1
:抓取成功但无新论文。2
:抓取过程中出现错误。
- 每个测试的状态以日志形式输出,确保脚本在部分测试失败时仍继续运行。
- 脚本捕获
-
动态测试用例:
# 自动生成文件名并运行测试
run_test_case "Test 1: Default parameters" \
"python main.py --json_file_name $(generate_json_file_name) --keyword '$DEFAULT_KEYWORD' --max_results $MAX_RESULTS"
run_test_case "Test 11: Fetch and return JSON" \
"python main.py --keyword '$DEFAULT_KEYWORD' --max_results $MAX_RESULTS --output_json"
完整输出日志:
==============================
Test 1: Default parameters
==============================
2024-11-20 17:23:19,698 - INFO - Fetching papers with parameters...
2024-11-20 17:23:26,615 - INFO - Saved 5 papers to results/test_papers_20241120172319.json
2024-11-20 17:23:26,616 - INFO - Fetch completed successfully with new papers.
Test passed: New papers were fetched and saved.
==============================
Test 11: Fetch and return JSON
==============================
2024-11-20 17:23:28,123 - INFO - Fetching papers with parameters for JSON output...
2024-11-20 17:23:29,456 - INFO - Saved 5 papers to results/test_papers_20241120172328.json
[
{
"doi": "10.1234/example1",
"title": "Sample Paper 1"
},
{
"doi": "10.1234/example2",
"title": "Sample Paper 2"
}
]
Test passed: Fetched JSON returned and saved correctly.
-
唯一文件名生成: 引入了命令行参数解析器 (
argparse
),使得用户在运行脚本时可以直接传递查询条件和保存结果的文件名。- 参数说明:
--json_file_name
:用于指定保存查询结果的 JSON 文件名。默认生成一个基于当前时间戳的文件名,以确保唯一性,避免多个调用者间的冲突。--keyword
:用于指定搜索关键词,默认为 "cancer"。--author
:用于指定搜索的作者名。--journal
:用于指定搜索的期刊名称。--year
:用于指定搜索的出版年份。--max_results
:用于指定最大检索结果数,默认为 10。
- 使用示例:
python main.py --json_file_name results.json --keyword cancer --author "John Doe" --journal Nature --year 2020 --max_results 10
- 参数说明:
-
结果文件名默认使用时间戳 (
papers_<timestamp>.json
) 生成,确保每次运行得到唯一的文件名,适用于多用户并行查询场景。- 用户也可以通过命令行参数
--json_file_name
自定义文件名。
- 用户也可以通过命令行参数
-
重构为 main() 函数:
- 将主要的逻辑重构为 main() 函数,提高了代码的可读性和可维护性。
- 增加
AbstractPaperFetcher
的保存路径配置,所有结果文件默认保存在results/
文件夹中。 - 修改
fetch_by_keywords
方法,返回保存的论文数量以供外部程序判断成功与否。 - 增加系统退出状态码功能,用于外部调用程序可以依据退出码判断抓取是否成功:
0
表示抓取成功且保存了新论文。1
表示未抓取到新论文或出现错误。
- 增加缓存和文件锁机制,提升文件写入效率并防止并发冲突。
- 使用
asyncio
进行异步调度,提高多任务并行效率。 - 动态调整
max_results
参数,依据调度时间自动调整抓取数量。
Paper Fetcher Project 是一个 Python 项目,旨在从多个学术资源(例如 ArXiv、Google Scholar 和 PubMed)抓取学术论文,并提供灵活的定制选项。该项目支持定时抓取、去重机制,并可扩展至更多学术数据库。它可以作为科研工作者自动化收集学术资源的工具。
- 多源数据抓取 :
- 支持从 ArXiv 、Google Scholar 和 PubMed 三个常见学术资源抓取论文数据。
- 每个资源的抓取器模块化设计,支持通过继承
AbstractPaperFetcher
类,轻松添加新的学术数据库。
- 组合条件抓取 :
- 项目支持根据 组合条件 来进行精准的论文抓取,用户可以提供 关键词 、 作者 、 年份 、期刊 等多个条件进行组合查询。例如,您可以同时指定论文的关键词为 "cancer",期刊为 "Nature",年份为 "2020",这样抓取器会根据这些条件抓取符合要求的论文。
- 组合查询的条件可以灵活定制,未提供的条件将被忽略。例如,如果您只指定关键词而不指定作者,系统会根据关键词抓取所有相关的论文。
- 去重机制 :
- 自动检查抓取到的论文是否已经下载,基于唯一标识符(如 DOI 或 URL)实现去重,避免重复抓取同一论文。
- 已抓取的论文 ID 会保存在 JSON 文件中,作为后续去重参考。
- 随机延迟防爬虫机制 :
- 抓取过程中引入了 随机延迟 ,防止过于频繁的请求触发目标网站的反爬机制。每次抓取的延迟时间在用户定义的最小和最大延迟之间随机分配。
- JSON 格式数据保存 :
- 抓取到的论文信息将以 JSON 格式保存,便于后续使用或分析。
- 每次抓取后,新的数据会自动追加到现有的 JSON 文件中。
- 定时任务支持 :
- 内置定时调度功能,支持每隔固定时间间隔(如每 30 分钟)自动抓取最新的论文。
- 还可以指定每日固定时间(如每天早上 6:00)抓取最新的论文。
- 易扩展性 :
- 使用面向对象的设计模式,允许用户通过继承并实现必要的方法来自定义新的数据源。
- 各抓取模块如
ArXivFetcher
,GoogleScholarFetcher
,PubMedFetcher
都遵循统一的接口,便于扩展与维护。
- 日志记录 :
- 使用 Python 的
logging
模块进行日志记录,默认输出到控制台,帮助用户追踪抓取过程中的状态和错误。 - 可以自定义日志级别,如
INFO
、DEBUG
、ERROR
等,以满足不同场景下的需求。
- 使用 Python 的
paper_fetcher_project/
│
├── paper_fetcher/ # 核心功能模块
│ ├── __init__.py # 初始化模块
│ ├── abstract_fetcher.py # 抽象类及其基础方法
│ ├── arxiv_fetcher.py # ArXiv 抓取器
│ ├── google_scholar_fetcher.py# Google Scholar 抓取器
│ ├── pubmed_fetcher.py # PubMed 抓取器
│ └── utils.py # 通用工具函数 (如日志配置、去重等)
│
├── tests/ # 单元测试
│ ├── test_arxiv_fetcher.py # ArXiv 抓取器测试
│ ├── test_google_scholar_fetcher.py # Google Scholar 抓取器测试
│ ├── test_pubmed_fetcher.py # PubMed 抓取器测试
│
├── requirements.txt # 项目依赖
└── main.py # 运行脚本
确保您已安装以下内容:
- Python 3.7 或更高版本
pip
:Python 包管理工具
首先,克隆此项目到本地:
git clone https://github.com/HowieHsu0126/RMS.git
cd paper_fetcher_project
运行以下命令安装所需的 Python 包:
pip install -r requirements.txt
项目提供了多种抓取方式。以下是抓取 PubMed 论文的示例:
python main.py
main.py
文件中包含了具体的抓取配置,例如抓取的关键词、作者和年份。
可以通过修改 main.py
中的 search_params
来定制抓取参数。例如,抓取指定期刊和年份的论文:
search_params_pm = {
"keyword": "cancer",
"author": "",
"journal": "Nature",
"year": "2020"
}
要添加新的数据源,只需继承 AbstractPaperFetcher
类并实现 fetch_papers
方法即可。
项目支持定时任务调度。您可以使用以下代码设置每隔 30 分钟抓取一次论文:
pm_fetcher.schedule_task(search_params_pm, interval_minutes=30, max_results=5)
该项目包含单元测试文件,使用 pytest
进行测试。
安装 pytest
依赖:
pip install pytest
运行所有测试:
pytest tests/
项目使用 Python 内置的 logging
模块进行日志记录。默认日志输出到控制台。可以通过修改 paper_fetcher/utils.py
文件来配置日志级别。
欢迎任何形式的贡献!请确保在贡献代码前遵循以下指南:
- Fork 本仓库,创建您的 feature 分支。
- 编写清晰、可读的代码,确保符合 PEP8 代码风格。
- 编写测试:所有新功能或改动都应包含适当的测试。
- 提交 Pull Request。