1. 在pubmed上勾选文献,点击【save】

2.如图选择,点击【create】

3.浏览器就会下载出一个txt

4.接下来运行代码,代码里自带“文件选择器”

import requests
import time
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import xlwt
import requests
import datetime
import tkinter.filedialog
from tkinter.ttk import Progressbar
import tkinter as tk
import os
from tkinter import *
from tkinter import scrolledtext#---- 设置保存pdf的路径
desktoppath = os.path.join(os.path.expanduser("~"), 'Desktop')
out_path = desktoppath + "\pubmed下载文献2"                               # 输出文件夹所在地
if not os.path.exists(out_path):# 输出文件夹所在地,如果不存在,则新建一个os.mkdir(out_path)#稍后在识别题录会使用到的3个列表
pmc_list = []
pmc_success = []
date_list = []
title_list = []
PDF_title = []def ChooseTxt():pmc_list.clear()pmc_success.clear()PDF_title.clear()date_list.clear()title_list.clear()# 获取桌面路径desktoppath = os.path.join(os.path.expanduser("~"), 'Desktop')# print(desktoppath)downloadpath = desktoppath.replace("\Desktop", "\Downloads")# print(downloadpath)filename = tk.filedialog.askopenfilename(title='选择一个txt文件', filetypes=[('txt', '*.txt'), ('All Files', '*')],initialdir=downloadpath)if filename == '':button1.config(state=tk.DISABLED)  # 让按钮变成灰色text1.delete('1.0', "end")text1.insert("1.0", "文件为空,请重新选择")text1.insert("1.0", "\n")text1.update()else:text1.delete('1.0',"end")text1.insert('1.0', "txt文件路径已定位:  " + filename  + "          ")text1.insert("1.0", "\n")text1.update()txt_path = filename## 对pubmed导出的txt进行操作with open(txt_path, encoding='utf-8') as f:nextlineID_list = []  # 处理title的时候用,但是它不能进入循环for lineID, line in enumerate(f.readlines()):  # 可以获取行号# 处理发表年份if "DP  -" in line:date = line.split(" ")[3].replace("\n", "")# print(line.replace("\n",""))# print("发表年份: " + date)text1.insert("1.0", "发表年份: " + date + "\n")  # 文本框显示date_list.append(date)  # 写入list# 处理titleif "TI  -" in line and ("." not in line or "?" not in line):nextlineID = lineID + 1thirdlineID = lineID + 2nextlineID_list.append(nextlineID)nextlineID_list.append(thirdlineID)title01 = line.split(" ", 3)[3]  # 这里使用了不同的分割方法,因为标题里面有很多的空格title01 = title01.replace("\n", "")# print(f"下一行、下两行的ID是:{nextlineID_list}")# print("标题第一段:" + title01)# text1.insert("1.0", f"下一行、下两行的ID是:{nextlineID_list}" + "\n")  # 文本框显示# text1.insert("1.0", "标题第一段:" + title01 + "\n")  # 文本框显示if nextlineID_list:# print("列表不为空")if lineID == nextlineID_list[0]:title02 = line.split(" ", 6)[6].replace("\n", "")# print("标题第二段:" + title02)# text1.insert("1.0", "标题第二段:" + title02 + "\n")  # 文本框显示if lineID == nextlineID_list[1]:if "." in line and ("." not in line or "?" not in line) and " - " not in line:title03 = line.split(" ", 6)[6].replace("\n", "")# print("标题第三段:" + title03)# text1.insert("1.0", "标题第三段:" + title03 + "\n")  # 文本框显示title = title01 + title02 + title03# print("标题拼起来:" + title)# text1.insert("1.0", "标题拼起来:" + title + "\n")  # 文本框显示# print("---")title_list.append(title)else:title = title01 + title02# print("标题拼起来:" + title)# text1.insert("1.0", "标题拼起来:" + title + "\n")  # 文本框显示# print("---")title_list.append(title)nextlineID_list = []  # 写入listif "TI  -" in line and ("." in line or "?" in line):title = line.split(" ", 3)[3]title = title.replace("\n", "")# print("标题只有一段:" + title001)# text1.insert("1.0", "标题只有一段:" + title + "\n")  # 文本框显示title_list.append(title)nextlineID_list = []# 处理PMCif "PMC -" in line:pmc = line.split(" ")[2].replace("\n", "")pmc_list.append(pmc)if "SO  -" in line:  #到了的时候(说明处理完一段了)if len(date_list) == len(title_list) == len(pmc_list):# print("匹配")text1.insert("1.0", " √有pmc号" + "\n" + title + "\n")  # 文本框显示pmc_success.append(pmc)if len(pmc_list) < len(title_list):pmc_list.append("缺失pmc")# print("doi: 缺失doi")text1.insert("1.0", " XXX缺pmc号" + "\n" + title + "\n")  # 文本框显示# print("-"*100)text1.insert("1.0", "-"*100 + "\n")  # 文本框显示text1.update()f.close() #关闭文档# print(pmc_list)# print(len(pmc_list))number_success = str(len(pmc_success))number = str(len(pmc_list))text1.insert("1.0", "-"*100 + "\n")  # 文本框显示text1.insert("1.0", number_success + " 篇文献有pmc号,可供下载" + "\n")  # 文本框显示text1.insert("1.0", number + " 篇文献被识别" + "\n")  # 文本框显示text1.insert("1.0", "-"*100 + "\n")  # 文本框显示text1.update()#生成pdf标题用i = 0while i < len(date_list):pdf_title = date_list[i] + "_" + title_list[i]PDF_title.append(pdf_title)i = i + 1button1.pack()# button1.config(state=NORMAL)#---- 下载文献
UA = UserAgent()
def Download():  # 下载的操作button1.config(state=tk.DISABLED)  # 让按钮变成灰色button2.config(state=tk.DISABLED)  # 让按钮变成灰色p_bar['maximum'] = len(pmc_list)  #更新进度条的最大值#用来记录下载成功或失败的excel读写FAILURE = []FAILURE_URL = []SUCCESS = []i = 0for pmc_num in pmc_list:# 更新进度条最大值p_bar['maximum'] = len(pmc_list)# 更新进度条值p_bar['value'] = iroot.update()text1.insert("1.0", "-"*100 + "\n")  # 文本框显示text1.update()#设置保存的文件名titlename = PDF_title[i]filepath = out_path + "\\" + titlename + ".pdf"if ": " in filepath:  # 如果文件名称中存在冒号,无法正常生成pdffilepath = filepath.replace(":", "") + ".pdf"print(filepath)i = i + 1if pmc_num == "缺失pmc":FAILURE.append(titlename)FAILURE_URL.append("缺失pmc号")continue# 判断是否存在这个文件了,避免重复下载if not os.path.exists(filepath):text1.insert("1.0", "  Trying:  " + titlename + "\n")    #文本框显示text1.update()#找到pmc下载的网址url = 'https://www.ncbi.nlm.nih.gov/pmc/articles/' + pmc_num + "/"# print(url)headers = {'User-Agent': UA.ie}request = requests.get(url, headers=headers)try:request = requests.get(url, headers=headers)     #打开网址# print(request)  # <Response [200]> = successfulBsBOJ = BeautifulSoup(request.content, 'lxml')   #解析返回的内容download_url = BsBOJ.find_all(attrs={'class': "int-view"})   #找到下载的按钮# print(download_url)download_link = download_url[1].get('href')download_head = "https://www.ncbi.nlm.nih.gov"download_url = "https://www.ncbi.nlm.nih.gov" + download_linkprint(download_url)text1.insert("1.0", "  Downloading..." + "\n")  #文本框显示text1.insert("1.0", download_url + "\n")  # 文本框显示text1.insert("1.0", "!! 如果下载失败,手动复制粘贴这个网址到浏览器即可下载成功:" + "\n")  # 文本框显示text1.update()# ---- 保存pdfr = requests.get(download_url, headers=headers)with open(filepath, 'wb') as f:f.write(r.content)text1.insert("1.0", " √ 下载成功:" + "\n" + titlename)  # 文本框显示text1.update()SUCCESS.append(titlename)except Exception as e:print("无法下载: " + titlename)text1.insert("1.0", " X 下载失败: " + titlename + "\n")  # 文本框显示text1.update()FAILURE.append(titlename)FAILURE_URL.append(download_url)else:text1.insert("1.0", "  该Pdf已存在: " + titlename + "\n")  # 文本框显示text1.update()SUCCESS.append(titlename)p_bar['value'] = i# 读写excel# 1 新建excel文件wb = xlwt.Workbook()# 2 新建工作表并重命名ws = wb.add_sheet('Sheet1')  # 将工作表worksheet命名为‘Python’# 3 写入内容style0 = xlwt.XFStyle()font0 = xlwt.Font()font0.bold = True  # 字体是否为粗体style0.font = font0ws.write(0, 0, "Download", style0)ws.write(0, 1, "Article", style0)ws.write(0, 2, 'URL', style0)  # write(行,列,写入的内容)# 创建一个样式对象,初始化样式 stylestyle = xlwt.XFStyle()# 为样式创建字体font = xlwt.Font()font.colour_index = 4  # 设置字体颜色 4是深蓝色font.name = 'Times New Roman'  # 设置字体style.font = font  # 应用字体的设置style2 = xlwt.XFStyle()font2 = xlwt.Font()font2.underline = True  # 字体是否有下划线style2.font = font2  # 应用字体的设置col = 0row = 0for i in range(len(FAILURE)):row = row + 1ws.write(row, 0, "失败", style)ws.write(row, 1, FAILURE[i])ws.write(row, 2, xlwt.Formula(f'HYPERLINK("{FAILURE_URL[i]}")'), style2)i = i + 1failure_num = rows = 0for s in range(len(SUCCESS)):row = row + 1ws.write(row, 0, "下载成功")ws.write(row, 1, SUCCESS[s])  # row不变,继续接下去success_num = row - failure_num# 4 保存ws.col(1).width = 40000ws.col(2).width = 15000  # 修改某一列的宽# 获取时间,用于excel表格的命名timeNow = datetime.datetime.now().strftime("%Y-%m-%d %H时%M分%S秒")  # 时间类型转为字符串类型excel_path = out_path + f'\.pubmed下载文献报告{timeNow}.xls'  # 报告的excel文件下载地方wb.save(excel_path)# print("结束。已经保存")# print("成功了 " + str(success_num) + " 篇")# print("失败了 " + str(failure_num) + " 篇")text1.insert("1.0", "成功了 " + str(success_num) + " 篇\n")text1.insert("1.0", "失败了 " + str(failure_num) + " 篇\n")text1.insert("1.0",f"已经保存excel文件,文件路径为:{excel_path}\n")text1.update()button1.config(state=tk.DISABLED)  # 让按钮变成灰色button2.config(state=tk.NORMAL)  # 让按钮变成灰色text1.insert("1.0", "\n" + "----------下载完成,右上角点击关闭即可,文件存放在桌面文件夹【pubmed下载文件】---------- ")  # 文本框显示text1.update()button3.pack()button3.config(state=NORMAL)root = tk.Tk()
root.geometry('1280x700')
root.configure(bg='white')  # 设置窗口背景色
root.title("pubmed文献下载器")#文本框
text1= tk.scrolledtext.ScrolledText(root, width=160, height=20, bg="white", fg="black", font=('微软雅黑', 12), padx=10, pady=10)
# text1 = tk.Text(root, width=160, height=22, bg="white", fg="black", font=('微软雅黑', 12), padx=10, pady=10)
text1.pack()
text1.insert("1.0","请点击下方正中的‘选择文件’按钮,选择从Pubmed上下载的txt格式文件""\n""--------------------------------------------------------------------------""\n""下载方法:""\n""① pubmed选好文献后,选择【save】""\n""②【selection】选择自己合适的 - all results/selection ""\n""③【format】选择’Pubmed‘!!""\n""④ 点击【create file】下载为txt格式""\n")
#进度条
p_bar = Progressbar(root, length=1250)
p_bar.pack(pady=10)
# 设置进度条最大值
p_bar['maximum'] = len(pmc_list)
# 设置进度条当前值(此处为清零/设初值为零)
p_bar['value'] = 0var = tk.StringVar()
var2 = tk.StringVar()
var.set("开始下载")button3 = tk.Button(root, text="重试", command=Download, padx=20, font=('微软雅黑',16),fg='blue')button2 = tk.Button(root, text="选择文件", command=ChooseTxt, padx=20, font=('微软雅黑',16))
button2.pack()button1 = tk.Button(root, textvariable=var, command=Download, padx=20, font=('微软雅黑',16),fg='dark red')
# button1.pack()
root.mainloop()

5.运行代码,就会出现一个框,点击【选择文件】,选择刚下好的txt

6.点击【开始下载】

下载完成后:

注:

由于技术垃圾,代码还有很多冗余的部分,如果有路过的大神,欢迎提供修改意见。虚心向您请教。谢谢!

这是基于pmc号的,基于sci-hub的可参考之前发表的

pubmed批量下载文献 傻瓜操作相关推荐

  1. 如何极速下载网页上的文件? 怎么批量下载文献

    如何快速下载网页上的文件?当今许多文件会被传输至网盘等云空间中,但有些文件仍可以通过网页下载,使用IDM我们可以快速下载不同类型的网页文件.怎么批量下载文献?在写论文时,常需要引用某些文献来支持自己的 ...

  2. 批量下载文献中的参考文献

    批量下载文献中的参考文献 这里写目录标题 批量下载文献中的参考文献 一级目录 二级目录 三级目录 一.下载所有你需要文献的引文题录 二.导入到文献管理软件中 **点击导入文献,上一步已经下载的,如果不 ...

  3. Python爬虫批量下载文献

    最近在看NeurIPS的文章,但是一篇篇下载太繁琐,希望能快速批量下载下来. 于是想到了之前一直听说的python爬虫,初次学着弄一下. 用到了requests,BeautifulSoup,urlli ...

  4. 使用scihub2pdf,在scihub通过doi批量下载文献pdf格式

    最近要批量下载某个方向的一些文献,准备通过sci-hub来下载,在找python爬虫的方式下载文献的时候发现了scihub2pdf工具. 一开始是看到这篇文章:利用python下载scihub成文献为 ...

  5. 【批量下载文献】使用Endnote、IDM、网址批量打开工具

    Endnote设置 "Tools"--"Output Styles"--"New Style"; Full name: 一键下载PDF &q ...

  6. BPRetriever:批量Sci文献检索下载工具(图形界面版)

    2022.4.10 在V2.1版本中,已修复doi下载报错的问题,另外暂时将WOS检索功能删除. 2022.1.14 目前Web of science 和Doi下载功能还有点问题,先不要使用这两个功能 ...

  7. Python+IDM实现百度网盘批量下载

    最近发现了一个Tampermonkey脚本,用来下载百度网盘能达到几十MB/s,然而不能批量下载(比如几十集的电视剧),于是借用爬虫知识,利用Python+Selenium批量调用此脚本获得直链,并在 ...

  8. python 批量下载pubmed文献 (详细教程)使用noteexpress

    首先是NOTEEXPRESS操作 1.pubmed上下载好题录,导入NE.如下图所示,有2篇文献. 2.点击[预览],可以看到我们[导出题录]时候保持的样式 ​ 3.打开[样式管理器]如下: 4. 选 ...

  9. 文献管理软件//Zotero的常用插件——Sci-hub/shortdoi批量下载、Zotfile重命名PDF文件及ZoteroQuickLook快速预览(二)

    Zotero|方便好用的插件 一. Zotfile|文件重命名 1.1 Zotfile下载 1.2 Zotfile安装 1.3 Zotfile配置 1.4 Zotfile重命名文件 二. QuickL ...

最新文章

  1. 热力学第二定律中的悖论 | 集智百科
  2. python下载大文件-使用请求在python中下载大文件
  3. js实现双向链表互联网机顶盒实战应用
  4. LaTeX半小时速成究极进化版(修改版)
  5. ubuntu16.04安装Virtualbox
  6. [置顶]动态网页开发基础【笔记】
  7. 2014年12月26日
  8. php switch正则表达式,switch的用法以及正则表达式简单的用法
  9. 【转】JavaScript中的匿名函数及函数的闭包
  10. jboss eap6.1(4)(部署应用)
  11. java实现键盘输入_java 键盘输入的多种实现方法
  12. 图像局部特征(十四)--MSER特征
  13. 《金字塔原理》要点汇总
  14. 异常声音检测之kaldi DNN 训练
  15. win10没有realtek高清晰音频管理器_Win10如何让电脑睡眠不断网?电脑睡眠状态不断网继续下载的方法...
  16. DC-DC buck降压电路 电压电流双闭环PI控制matlab仿真模型
  17. C语言程序设计教程(第三版)课后习题6.1
  18. 企业官网小程序有什么作用
  19. android 键盘设置详解
  20. Ubuntu虚拟机中VCS安装和启动过程中遇到的问题总结

热门文章

  1. 出一个18650圆柱锂电池comsol模型 参数已配置,生热研究
  2. 2005年GCT真题
  3. js获取元素绝对坐标
  4. 安徽三连学院计算机考试,安徽三联学院2017年3月计算机等级考试报名时间
  5. Self Host 使用 Exceptionless 实时监控程序运行日志服务
  6. 风光电项目斥资39亿美元,伯克希尔重金布局有何意图?
  7. fastdeploy快速部署yolov5离线模型
  8. jQuery控制文本框只读属性
  9. JavaScript之事件(十)
  10. clipboard .stop 复制失败解决方式(实现文本复制)