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

废话不多说,开整!


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

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

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

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

可以看到,我需要的数据是有三十多万条,但是每次只能下载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

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

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

最后的结果是存放在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号,我们后面进行摘要的提取才能准确定位。

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

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

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

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

Python:利用Entrez库筛选下载PubMed文献摘要的更多相关文章

  1. python利用selenium库识别点触验证码

    利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分 ...

  2. Python利用PyExecJS库执行JS函数

      在Web渗透流程的暴力登录场景和爬虫抓取场景中,经常会遇到一些登录表单用DES之类的加密方式来加密参数,也就是说,你不搞定这些前端加密,你的编写的脚本是不可能Login成功的.针对这个问题,现在有 ...

  3. python 利用PIL库进行更改图片大小的操作

    python 是可以利用PIL库进行更改图片大小的操作的,当然一般情况下是不需要的,但是在一些特殊的利用场合,是需要改变图片的灰度或是大小等的操作的,其实用python更改图片的大小还是蛮简单的,只需 ...

  4. Python:利用 selenium 库抓取动态网页示例

    前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...

  5. python利用requests库模拟post请求时json的使用

    我们都见识过requests库在静态网页的爬取上展现的威力,我们日常见得最多的为get和post请求,他们最大的区别在于安全性上: 1.GET是通过URL方式请求,可以直接看到,明文传输. 2.POS ...

  6. python利用PIL库使图片高斯模糊

    一.安装PIL PIL是Python Imaging Library简称,用于处理图片.PIL中已经有图片高斯模糊处理类,但有个bug(目前最新的1.1.7bug还存在),就是模糊半径写死的是2,不能 ...

  7. python 利用turtle库绘制七段数码管的方式,绘制当前事件(时分秒00:00:00)

    # coding:utf-8# 绘制七段数码管,显示当前时间import timeimport turtle as tt # 绘制间隔def drawGap(): tt.penup() tt.fd(3 ...

  8. python 利用turtle库绘制五角星

    # -*- coding: utf-8 –*-import turtleimport math def draw_polygon(aTurtle, size=50, n=3): for i in ra ...

  9. Python利用itchat库向好友或者公众号发消息

    首先获得好友或者公众号的UserName 1.获取好友UserName #coding=utf8 import itchat itchat.auto_login(hotReload=True) #想给 ...

随机推荐

  1. UI设计学习总结

    UI设计学习总结 平面设计基础 平面构成 三大构成:点线面 重复构成 相同,有规律的重复 近似构成 形状,大小,色彩,肌理相似 渐变构成 色彩逐渐变化 发射构成 通过一点向四周扩散犹如绽放的花朵 密集 ...

  2. Windows下mysql5.6升级到5.7的方法

    Mysql的升级方式分为两种:原地升级和逻辑升级.这两种升级方式,本质没有什么区别的. 只是在对数据文件的处理上有些区别而已.原地升级是直接将数据文件进行拷贝,而逻辑升级对数据文件的处理方式是通过逻辑 ...

  3. 出Bug表-假如诸葛亮是程序员(1024程序员节日献礼)

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 出Bug表 南瓜言:先司创业未半而中道破产,今培训造才,网课套钱,此诚百家争鸣之时也.然优秀骨干组队离职,新招小白乐于摸鱼者 ...

  4. 【CF1436B】Prime Square 题解

    原题链接 题意简介 要求构造一个由不大于 1e5 的非负数构成的正方形矩阵,矩阵的每个元素不是质数,但每一行.每一列的数字的和都是质数. 思路分析 看到样例二,我们知道数字可以重复. 于是,我们很容易 ...

  5. linux压缩和解压文件命令

    tar  解包:tar zxvf filename.tar  打包:tar czvf filename.tar dirnamegz命令  解压1:gunzip filename.gz  解压2:gzi ...

  6. Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍

    最近在看一个同学代码的时候,发现代码中大量使用了 Google 开源的 Guava 核心库中的内容,让代码简单清晰了不少,故学习分享出 Guava 中我认为最实用的功能. Guava 项目是 Goog ...

  7. 全球最火的程序员学习路线!没有之一!3天就在Github收获了接近1w点赞

    大家好,我是G哥,目前人在荆州办事,但是干货还是要安排上! 国外有一个爆火的开发人员学习路线,目前已经在 Github收获了 131 k+ star,Star 数量在 Github 所有仓库中排名第 ...

  8. nacos 作为配置中心使用心得--配置使用

    1.页面配置 撇开原理不谈,先来介绍下nacos的基本使用,如下图nacos配置是以data id为单位进行使用的,基本上一个服务的一个配置文件就对应一个data id,支持的格式有xml,yaml, ...

  9. python中的类方法,实例方法和静态方法的区别

    类方法是类的方法,在定义的时候要在上方加上一个@classmethod装饰器来进行装饰,形参是cls,类和实例都可以取调用类方法: 实例方法是实例对象方法,只有实例可以调用,类是不能调用的,形参是se ...

  10. MySQL图形界面客户端

    图形界面客户端 使用图形界面客户端操作数据库更直观.方便.下面三个客户端都能操作MySQL,各有各自的优点. 1.Navicat Premium 下载安装包下载 关注公众号[轻松学编程],然后回复[n ...