Skip to content

基于多线程协程的文献下载器(NCBI / ACS)

License

Notifications You must be signed in to change notification settings

Dragon-GCS/GetPaper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GetPaper v2.0

基于Sci-Hub的文献下载器,输入关键词后即可在指定数据库中爬取所需文献。 GUI

  • 使用ttk.bootstrap重新设计GUI,增加作者、期刊、日期、排序方式选项
  • 使用基于协程的爬虫引擎提高文章爬取速度,同时使用多线程避免GUI线程阻塞问题
  • 增加爬虫引擎接口,可添加其他数据库爬虫。目前已有ACS和PubMed爬虫引擎。
  • 增加翻译功能接口,可添加其他的翻译源,目前使用的是百度翻译Api。
  • 通过Sci-Hub下载指定文献或所有爬取结果的pdf

20220712: ACS增加反扒验证,目前只有PubMed可用

运行方法

项目已打包为exe文件,下载后可直接使用。

运行环境:python3.8+

  • 克隆本项目后cd至项目目录
  • 使用pip install -r requirements.txt
  • python main.pyw 运行项目
  • 如需打包,运行pyinstaller main.specmain.spec已配置好相关静态文件。

翻译功能需要自行注册百度翻译Api后将个人appidkey添加到api_info.json中。exe可直接使用翻译。

使用方法

  1. 选择需要查询的数据库
  2. 输入查询关键词(必选)以及其他搜索条件(PubMed搜索需要同时输入开始时间和截至时间后,搜索时间才会生效)。
  3. 点击关键词搜索爬取文献数量信息后,输入需要获取的文献数量,点击获取详情开始爬取文献标题、作者、期刊等信息。不建议在不清楚文献搜索结果总数时直接点击获取详情,如果获取数量大于搜索结果数量会等待至Timeout后结束任务。
  4. 双击搜索结果打开详情页,点击翻译按钮对文献标题和摘要内容进行翻译,点击下载按钮将从Sci-Hub下载本文献的pdf。
  5. 主界面的全部下载用于从Sci-Hub下载搜索结果中的所有文献的pdf文件,如下载失败会生成对应的txt文件。为避免对其服务器造成过大压力,已限制下载频率。
  6. 主界面的导出数据用于将搜索结果导出为csv文件,可使用excel另存为xlsxlsx
  7. 主界面的通过DOI下载可以通过读取txt文件中的doi进行文献下载。要求txt文件中每行有且仅有一个doi号

项目结构

├─getpaper
│  ├─GUI            # GUi模块
│  ├─spiders        # 爬虫模块
│  ├─translator     # 翻译模块
│  ├─config.py      # 相关配置文件
│  ├─download.py    # Sci-Hub下载模块
│  └─utils.py       # 工具模块
├─hook              # 用于pyinstaller打包,用于导入项目中动态导入的模块
└─main.pyw          # 入口

爬虫引擎接口

  • getpaper/spiders内添加name.py文件后能够被自动识别并在GUI中显示,如需打包为exe文件,则必须在getpaper/config.pyif hasattr(sys, "frozen")spider_list中添加对应的<name>,否则打包后无法识别动态导入的模块。

  • 类名必须为Spider且继承getpapaer._spiders中的_Spider基类,用于检测爬虫是否实现了以下方法:

    • 初始化爬虫时调用的方法,用于接受GUI传入的搜索相关条目,进行解析后用于搜索,其中sorting为搜索结果,包括"相关性", "日期", "日期逆序"

      def parseData(self,
                    keyword: str,
                    start_year: str,
                    end_year: str,
                    author: str,
                    journal: str,
                    sorting: str
                    ) -> Dict[str, Any]:
          """format details to search format"""
          pass
    • 根据搜索信息对数据库进行查找,并返回找到的文献数量提示信息,返回的字符串用于在GUI显示。

       def getTotalPaperNum(self) -> str:
           """ Get the total number of result
      
           Returns:
               num: number of search result
           """
           pass
    • 获取num篇文献的标题作者发表时间发表期刊摘要doi号网址,并将结果保存至queue中。

      def getAllPapers(self, queue: PriorityQueue, num: int) -> None:
          """ Get all papers detail
      
          Args:
              queue: a priority queue for storing result and was monitored by GUI thread then feedback progress,
                     details format is [index, (title, authors, date, publication, abstract, doi, web)]
              num: number of papers to get
          """
          pass
    • 该队列还用于监控当前的下载进度。数据保存顺序参考如下,不得更改顺序。其中index为文献的序号,用于按序输出搜索结果。

      queue.put(index, (title, authors, date, publication, abstract, doi, web))

翻译引擎接口

  • getpaper/translator内添加name.py文件后能够被自动识别并在GUI中显示,如需打包为exe文件,则必须在getpaper/config.pyif hasattr(sys, "frozen")translator_list中添加对应的<name>,否则打包后无法识别动态导入的模块。

  • 类名必须为Translator,用于动态导入该模块

  • api相关数据保存在getpaper/translator/_api_info.json中,推荐使用以下方法读取该json文件,该方法能够在打包后正常读取文件。

      import importlib.resources
      # 第一种
      f = importlib.resources.open_text('getpaper.translator', '_api_info.json')
      info = json.load(f)
      # 第二种
      txt = importlib.resources.read_text("getpaper.translator", "_api_info.json")
      info = json.loads(txt)
  • 实现translate(self, detail: str) -> str方法,文章的title和abstract会分别调用此方法进行翻译,返回的字符串会通过str()转换后显示到文本框内。

其他

  • 使用协程函数:使用getpaper.utils中的@AsyncFunc对主协程函数进行装饰,才可以被正常调用。

  • 异常处理:捕获异常后使用getpaper.utils中的TipException(tip),通过唤起该异常可以在GUI中显示对应的tip信息,不超过16个字符(8个汉字)。如果异常导致爬取任务中断,建议使用数据将queue填满或修改queue.max_size,否则在队列为full之前,GUI中的监控进度条与后台下载任务将持续运行至默认TIMEOUTTIMEOUT可在getpaper/config.py中进行修改


GetPaper 1.0

  • 根据输入的关键词,从选择的数据库中爬取文献的标题、作者、期刊、日期、摘要、doi和网址等信息。

  • 保存按钮可以将爬取到的信息保存至本地。

  • 下载按钮是根据爬取到的doi信息从sci-hub下载文献,但有时会出现http.client.IncompleteRead导致文献无法下载,与个人网络情况有关。

后续改进计划

  • 优化爬取结果的表现方法

  • 可从结果中选择需要下载的文献

  • 尝试增加其他数据库

  • 使用多线程提高文献信息获取速度

下载地址

  • pyinstaller打包后的exe文件大小为27M,保存在百度网盘提取码:17q8

About

基于多线程协程的文献下载器(NCBI / ACS)

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages