Python 利用Entrez库筛选下载PubMed文献摘要的示例


Posted in Python onNovember 24, 2020

作者:xiaolanLin

声明 :本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/xiaolan-Lin

一个不是学生物的孩子来搞生物,当真是变成了一块废铁啊,但也是让我体会到了一把生物信息的力量。

废话不多说,开整!

任务:快速高效从PubMed上下载满足条件的文献PMID、标题(TI)、摘要(AB)。

PubMed官网 https://pubmed.ncbi.nlm.nih.gov

此处有几种选择可以达到目的:

(1)官网上匹配筛选条件(注:匹配快速,但是下载下来的数量受到限制,每次只能下载10000条数据,甚至更少。)

Python 利用Entrez库筛选下载PubMed文献摘要的示例

 可以看到,我需要的数据是有三十多万条,但是每次只能下载10000条,那我岂不是要手动n次。。很明显,在大批量下载文献的情况下,官网不是很友好。

(2)R语言有个R包,叫做easyPubMed,这里我也给大家贴上学习指南(https://cran.r-project.org/web/packages/easyPubMed/vignettes/getting_started_with_easyPubMed.html)

由于我不喜欢用R写代码,所以我写一半还是换了Python,熟练R的小伙伴可以自行根据指南走通需求。

(3)重量级库来了,Python自带的Bio包中的Entrez检索库,简直就是我的救星,以下是我的代码:

注:Entrez在Bio包中,Bio的安装请移步 https://www.cnblogs.com/xiaolan-Lin/p/14023147.html

import numpy as np
 from Bio import Medline, Entrez # 一般是通过BioPython的Bio.Entrez模块访问Entrez
 from collections import Counter
 
 Entrez.email = "(此处写你自己在官网注册的邮箱账号)" # 应用自己的账号访问NCBI数据库
 
 # 此处需将服务器协议指定为1.0,否则会出现报错。http.client.IncompleteRead: IncompleteRead(0 bytes read)
 # 服务器http协议1.0,而python的是1.1,解决办法就是指定客户端http协议版本
 import http.client
 http.client.HTTPConnection._http_vsn = 10
 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
 
 """
 Entrez 是一个检索系统,可以用其访问NCBI数据库,比如说PubMed,GenBank,GEO等。
 获得有关 global PBDE 的所有文献的PubMed IDs
 """
 # handle_0 = Entrez.esearch(db="pubmed", term="drug therapy[Subheading] AND adverse effects[Subheading] AND humans[MeSH Terms]", retmax=306431)
 handle_0 = Entrez.esearch(db="pubmed", term="drug therapy[MeSH Subheading] AND adverse effects[MeSH Subheading] AND humans[MeSH Terms] AND (2000/01/01[Date - Publication] : 2021/12/31[Date - Publication])",
              ptyp="Review", usehistory="y", retmax=306431)
 record = Entrez.read(handle_0) # 获取检索条件的所有文献
 idlist = record["IdList"] # 提取出文献id
 print ("Total: ", record["Count"])
 No_Papers = len(idlist)  # 共306431篇文献 2000-01-01:2021-12-31
 webenv = record['WebEnv']
 query_key = record['QueryKey']
 
 total = No_Papers
 step = 1300
 print("Result items:", total)
 with open("./Data_PubMed/PBDE1.txt", 'w') as f:
   for start in range(0, total, step):
     print("Download record %i to %i" % (start + 1, int(start + step)))
     handle_1 = Entrez.efetch(db="pubmed", retstart=start, rettype="medline", retmode="text",
                 retmax=step, webenv=webenv, query_key=query_key) # 获取上述所有文献的PubMed IDs
     records = Medline.parse(handle_1)
     records = list(records) # 将迭代器转换至列表(list)
     for index in np.arange(len(records)):
       id = records[index].get("PMID", "?")
       title = records[index].get("TI", "?")
       title = title.replace('[', '').replace('].', '') # 若提取的标题出现[].符号,则去除
       abstract = records[index].get("AB", "?")
       f.write(id)
       f.write("\n")
       f.write(title)
       f.write("\n")
       f.write(abstract)
       f.write("\n")

话不多说,结果跑出来了我真的很快乐~

Python 利用Entrez库筛选下载PubMed文献摘要的示例

最后的结果是存放在txt文件中,大伙儿根据自己的需求改变代码所需字段啊。

现在我来解释一下,我贴上的这串代码的实现原理,首先是通过Entrez检索到符合我筛选条件的文献,里边的限制条件包括了几个词汇匹配以及时间限制,时间我限制在了2000年1月1日到2021年的12月31日(这里的时间我选用的是Date - Publication,时间选取Date - Completion、Date - Modification还是Date - Publication其实还是有争议的,大家自行考虑选取)。

Entrez.esearch的作用就是用来检索的,里边的参数db指向你要检索的数据库,代码中的注释也写了,Entrez作为一个接口检索,除了能够检索PubMed中的文献,也能去到别的数据库检索文献;term是写你的筛选语句,注意你写的检索语句不能带有引号,单引号也不行,否则会检索不到,如果不知道检索语句怎么写,或者是不知道字段是否被定义,可以在官网的检索那里https://pubmed.ncbi.nlm.nih.gov/advanced/选择字段输入内容自动生成query,但是生成的语句是不太智能的,会有很多括号是你不需要的,自己写代码的时候要适当去掉;ptyp我这里用的是Review,usehistory是y,意思是后边我的检索要记住这个语句,根据历史查询来检索;retmax如果不进行设置的话,默认给你的最大数据量好像是只有1000,我要的检索内容是超过这个值的,因此我需要自定义检索的数量。

Entrez.read是对Entrez.esearch检索到的内容进行读取,里边包含了9种元素,我们主要是想从中得到文献的id号,只有拿到了文献的id号,我们后面进行摘要的提取才能准确定位。

Python 利用Entrez库筛选下载PubMed文献摘要的示例

最后是循环当中步长的设置,这里就要根据自己的需求来定义了,包括内容的提取,因为我只需要PMID、标题(TI)、摘要(AB),所以我就没有加载别的内容进来,这里也有一点要注意,标题下载下来是大部分带有[ ].的,方便操作我直接就在下载的时候给去除了,这也是上面replace代码的由来。

附上我参考的链接,如果我这篇文章解决不了你的问题,那么希望下面的渠道能够帮助到你

https://zhuanlan.zhihu.com/p/54611852

https://zhuanlan.zhihu.com/p/262957260

以上就是Python 利用Entrez库筛选下载PubMed文献摘要的示例的详细内容,更多关于Python Entrez库下载PubMed文献的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中让MySQL查询结果返回字典类型的方法
Aug 22 Python
django实现用户登陆功能详解
Dec 11 Python
深入理解Django自定义信号(signals)
Oct 15 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
python装饰器相当于函数的调用方式
Dec 27 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
python实现扫雷游戏的示例
Oct 20 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
python装饰器代码解析
Mar 23 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 #Python
python爬虫快速响应服务器的做法
Nov 24 #Python
PyCharm Community安装与配置的详细教程
Nov 24 #Python
python3爬虫GIL修改多线程实例讲解
Nov 24 #Python
Django URL参数Template反向解析
Nov 24 #Python
python3爬虫中引用Queue的实例讲解
Nov 24 #Python
python3爬虫中多线程的优势总结
Nov 24 #Python
You might like
php email邮箱正则
2008/10/08 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
js左侧三级菜单导航实例代码
2013/09/13 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
Python之os操作方法(详解)
2017/06/15 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
奖学金自我鉴定范文
2013/10/03 职场文书
工作简报范文
2015/07/21 职场文书
清明节随笔
2015/08/15 职场文书
企业团队精神心得体会
2016/01/19 职场文书
信息技术课教学反思
2016/02/23 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python