Skip to content

Latest commit

 

History

History
169 lines (106 loc) · 6.65 KB

README_CN.adoc

File metadata and controls

169 lines (106 loc) · 6.65 KB

Pubmedsoso

Language: English | 简体中文

Pubmedsoso

一个自动批量提取pubmed文献信息和下载免费文献的小工具

主要功能

自己写的基于aiohttp pandas和xpath 的pubmed文献信息爬取和下载的工具,按照你给定的参数,按你的要求获取相关的文献信息,并且下载对应文献的PDF原文

下载速度大概是1s一篇,同时能够提取文献的大部分信息,并自动生成excel文件,包括文献标题,摘要,关键词,作者名单,作者单位,是否免费,是不是review类型等信息。

自动下载后,会将部分信息储存在本地的文本文件中,供参考,检索数据会储存在sqlite3数据库中,最后执行完成后,自动导出所有信息,生成一个Excel文件。

依赖模块

  • 基于python3.9,也支持更高版本,主要使用了pandas, xpath, asyncio, aiohttp

  • 项目页面右边的Release当中有Nuitka打包成的exe执行文件,自带所有依赖,可以直接下载后在windows下命令行执行使用。

  • 如果需要自己在python环境运行请根据 requirements.txt 文件安装对应的依赖

  asyncio~=3.4.3
  aiohttp~=3.11.8
  requests~=2.32.3
  lxml~=5.3.0
  pandas~=2.2.3
  openpyxl~=3.1.5
  colorlog~=6.9.0

使用方法

  1. 克隆项目,在命令行环境下安装项目所需的依赖文件

建议使用anaconda或者miniconda3等python虚拟环境工具

git clone https://github.com/hiddenblue/Pubmedsoso.git
cd Pubmedsoso
pip install -r requirements.txt

不方便安装git工具时,直接直接下载页面右边Release当中的ZIP解压执行

Pubmedsoso

  1. 在terminal中切换到项目文件夹,执行 python main.py 带上关键词参数 或者在直接执行exe可执行文件 pubmedsoso.exe + 关键词

比如

python main.py -k headache -n 5 -d 10 -y 5

-k headache 是此次运行输入的检索关键词(keyword)

如果你使用的关键字当中包含空格,请使用双引号将关键词整体围起来。 支持pubmed advance query box 比如 "headache AND toothache" 这样的包含AND NOT OR等逻辑表达的query

-n 参数后面数字指的是需要检索的页数, 每页会有50篇

-d 参数后面表示需要下载的文献的份数

-y 可选参数,后面表示你想检索的信息的年份范围,以年为单位,比如 -y 5表示近五年的文献

  • 输入页数时,每页会包含50个检索结果,数字不用设置得太大,否则需要较长时间执行

  • 然后输入需要下载的文献数量,程序会从搜索结果中找到free pmc 免费文献,自动下载,这里下载速度取决你的网络状况。

  • 每个文献下载超过30s自动超时跳过,下载下一个。

PS > python main.py --help

usage: python main.py -k keyword

pubmedsoso is a python program for crawler article information and download pdf file

optional arguments:
--help,       -h    show this help message and exit
--version,    -v    use --version to show the version
--keyword,    -k    specify the keywords to search pubmed
--pagenum,    -n    add --pagenum or -n to specify the page number to
--year        -y    add --year or -y to specify year scale you would to
--downloadnum,-d    a digit number to  specify the number to download
--directory   -D    use a vaild dir path specify the pdf save directory.
--output      -o    add --output filename to appoint name of pdf file
--loglevel    -l    set the console log level, e.g debug

如果你熟悉IDE的话,可以在pycharm或者vscode等python环境下运行main.py

  1. 根据提示输入 y 或者 n 决定是否以给定的参数执行程序

comfirm picture

pubmedsoso会按照你正常搜索的顺序进行爬取下载

Pubmedsoso

  1. 文献会自动下载到之前说的"document/pub/"下,同时会生成原始遍历信息的txt文件,程序最终执行完成会生成excel文件。

Pubmedsoso
WARNING

请勿过分爬取pubmed网站

因为本项目使用异步机制,具有很高的并发能力,访问速度等相关参数可以在 config.py 当中设置,默认数值不算太大。

ExcelHelper 模块

这个是方便大家在爬取之后,将历史信息导出到excel的模块,可以单独执行。比如在IDE或者命令行中执行 python ExcelHelper.py

Pubmedsoso

出现如上提示,可以选择sqlite3数据中的历史记录进行导出,会自动在本地生成一个导出的文件。不能有重复命名的excel文件,需要按提示删除

TO DO List

  • ❏ 精确地搜索下载,这个还有点难

  • ✓ 自定义关键词下载,等我有空弄明白pubmed的检索参数url生成规则就行(已经实现)

  • ❏ 对非免费文献的scihub自动补全下载,或许可以让用户写adapter自己实现

  • ❏ 能用的gui界面

  • ❏ 最好附带一个免费的百度翻译插件,有时候大家可能用得上

  • ✓ 采用OOP和更加现代化的工具重构项目

  • ✓ 使用异步的方式重构代码,提高执行的效率

  • ✓ 可能还需要一个堪用的日志系统

  • ❏ 可以做一个基于邮件的订阅-主动推送机制的主动的文献订阅功能,为用户推送最新文献

调试指南

因为asyncio异步模块的特殊性,在windows下调试时会出现一些特殊的问题 如果你需要对代码进行开发 调试,需要对两处进行修改

GetSearchResult.py 当中的

try:
    if platform.system() == "Windows":
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

    html_list = asyncio.run(WebHelper.getSearchHtmlAsync(param_list))

如果在windows下进行调试请注释上面的条件执行语句,否则调试时生效将出错

此外项目当中多处使用的 asyncio.run() 调试时需要启用debug参数

否则会出现运行卡住, 并报 TypeError: 'Task' object is not callable 错误

Update log

2022.5.16 更新了自动创建document/pub文件夹功能,不需要手动创建文件夹了,会自动检查和创建。
2023.08.05 更新修复了abstract爬取失败的bug,同时不再需要用户手动复制粘贴网页的参数了。
2024.11.23 作者竟然想起了这个黑历史一般的项目,偷偷更新一下,“这TM是我写的代码? 怎么这么烂"
2024.12.02 基于OOP xpath asyncio异步重构了整个代码,去掉运行速度限制,速度大概是原来的100倍, "写完好累好累"