Skip to content

Paper Fetcher Project 是一个开源的 Python 项目,旨在自动化从多种学术资源(例如 ArXiv、Google Scholar 和 PubMed)抓取学术论文的过程。该工具可以定时抓取并去重保存已获取的论文数据,帮助研究人员保持文献的更新和管理。

Notifications You must be signed in to change notification settings

HowieHsu0126/RMS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Paper Fetcher Project

Haowei Xu

Email: [email protected]

⚠️ 提示:在中国大陆运行该项目时,某些学术资源(如 Google Scholar)可能需要通过 VPN 才能正常访问。请确保您已配置 VPN 以避免网络访问限制。

功能更新日志

2024-11-20

  • 新增 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 脚本进行了以下更新:

    1. 动态生成唯一文件名

      • 每次测试中,抓取结果的 JSON 文件名基于时间戳生成,确保每次运行不会覆盖之前的结果。
      • 文件名格式:test_papers_<timestamp>.json
    2. 新增 fetch_and_return_json 方法的测试

      • 测试即时返回 JSON 格式结果的功能。
      • 验证抓取结果是否正确写入文件,同时返回的 JSON 数据是否符合预期。
    3. 全面的测试用例覆盖

      • 覆盖多种组合条件(如关键词、作者、期刊、年份等)。
      • 增加对 --output_json 和即时返回功能的验证。
    4. 退出码处理优化

      • 脚本捕获 main.py 的退出状态码,分别处理:
        • 0:抓取成功且有新论文。
        • 1:抓取成功但无新论文。
        • 2:抓取过程中出现错误。
      • 每个测试的状态以日志形式输出,确保脚本在部分测试失败时仍继续运行。

test.sh 功能示例

动态测试用例:

# 自动生成文件名并运行测试
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.

2024-11-07

  • 唯一文件名生成: 引入了命令行参数解析器 (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() 函数,提高了代码的可读性和可维护性。

2024-11-01

  • 增加 AbstractPaperFetcher 的保存路径配置,所有结果文件默认保存在 results/ 文件夹中。
  • 修改 fetch_by_keywords 方法,返回保存的论文数量以供外部程序判断成功与否。
  • 增加系统退出状态码功能,用于外部调用程序可以依据退出码判断抓取是否成功:
    • 0 表示抓取成功且保存了新论文。
    • 1 表示未抓取到新论文或出现错误。
  • 增加缓存和文件锁机制,提升文件写入效率并防止并发冲突。
  • 使用 asyncio 进行异步调度,提高多任务并行效率。
  • 动态调整 max_results 参数,依据调度时间自动调整抓取数量。

项目简介

Paper Fetcher Project 是一个 Python 项目,旨在从多个学术资源(例如 ArXiv、Google Scholar 和 PubMed)抓取学术论文,并提供灵活的定制选项。该项目支持定时抓取、去重机制,并可扩展至更多学术数据库。它可以作为科研工作者自动化收集学术资源的工具。

功能特点

  • 多源数据抓取
    • 支持从 ArXivGoogle ScholarPubMed 三个常见学术资源抓取论文数据。
    • 每个资源的抓取器模块化设计,支持通过继承 AbstractPaperFetcher 类,轻松添加新的学术数据库。
  • 组合条件抓取
    • 项目支持根据 组合条件 来进行精准的论文抓取,用户可以提供 关键词作者年份期刊 等多个条件进行组合查询。例如,您可以同时指定论文的关键词为 "cancer",期刊为 "Nature",年份为 "2020",这样抓取器会根据这些条件抓取符合要求的论文。
    • 组合查询的条件可以灵活定制,未提供的条件将被忽略。例如,如果您只指定关键词而不指定作者,系统会根据关键词抓取所有相关的论文。
  • 去重机制
    • 自动检查抓取到的论文是否已经下载,基于唯一标识符(如 DOI 或 URL)实现去重,避免重复抓取同一论文。
    • 已抓取的论文 ID 会保存在 JSON 文件中,作为后续去重参考。
  • 随机延迟防爬虫机制
    • 抓取过程中引入了 随机延迟 ,防止过于频繁的请求触发目标网站的反爬机制。每次抓取的延迟时间在用户定义的最小和最大延迟之间随机分配。
  • JSON 格式数据保存
    • 抓取到的论文信息将以 JSON 格式保存,便于后续使用或分析。
    • 每次抓取后,新的数据会自动追加到现有的 JSON 文件中。
  • 定时任务支持
    • 内置定时调度功能,支持每隔固定时间间隔(如每 30 分钟)自动抓取最新的论文。
    • 还可以指定每日固定时间(如每天早上 6:00)抓取最新的论文。
  • 易扩展性
    • 使用面向对象的设计模式,允许用户通过继承并实现必要的方法来自定义新的数据源。
    • 各抓取模块如 ArXivFetcher, GoogleScholarFetcher, PubMedFetcher 都遵循统一的接口,便于扩展与维护。
  • 日志记录
    • 使用 Python 的 logging 模块进行日志记录,默认输出到控制台,帮助用户追踪抓取过程中的状态和错误。
    • 可以自定义日志级别,如 INFODEBUGERROR 等,以满足不同场景下的需求。

目录结构

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 文件来配置日志级别。

项目贡献

欢迎任何形式的贡献!请确保在贡献代码前遵循以下指南:

  1. Fork 本仓库,创建您的 feature 分支。
  2. 编写清晰、可读的代码,确保符合 PEP8 代码风格。
  3. 编写测试:所有新功能或改动都应包含适当的测试。
  4. 提交 Pull Request。

许可证

MIT License

About

Paper Fetcher Project 是一个开源的 Python 项目,旨在自动化从多种学术资源(例如 ArXiv、Google Scholar 和 PubMed)抓取学术论文的过程。该工具可以定时抓取并去重保存已获取的论文数据,帮助研究人员保持文献的更新和管理。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published