美文网首页
2019-07-14

2019-07-14

作者: 树懒吃糖_ | 来源:发表于2019-07-14 13:29 被阅读0次

Python----->Pubmed文献摘要下载和整理 PART1

目的:下载检索词返回的文献摘要,现在仅针对NCBI pubmed 数据库,下载格式为xml。从xml文本中提取需要的字段,整理成标准模式,此外还需要增加发表期刊的影响因子,以及统计摘要中出现的基因词频,为后续的工作准备。
不建议爬取NCBI容易被封,而且NCBI有开放的API接口,允许自由下载。只研究了pubmed 中下载的方法,如果是其他数据库需要自己看文档,附上使用文档链接:https://www.ncbi.nlm.nih.gov/books/NBK25497/


思路:

(1) 获得文献Pubmed id
pubmed提供的接口:https://eutils.ncbi.nlm.nih.gov/entrez/eutils/
import requests 可以很方便的下载,这边顺便提一下url构建规则。url构建规则:url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=' + db + '&term=' + query + '&usehistory=y' ,其中db表示数据库,query表示检索关键词
例如:
query = '(((lung+cancer)+AND+gene[Title/Abstract])+AND+("2010"[Date - Publication] : "2020"[Date - Publication])'

def get_udi(url):# 获得pubmed文献的uid
    # 参数说明:url:构建的用于检索的url; i:检索关键词; basepath:保存的根目录
    docsums = requests.get(url).text
    # print(docsums)
    ids = re.findall(r'<Id>(\d+)</Id>', docsums)
    if len(ids) > 0:
        print('search counts: ', len(ids))
        return ids
    else:
        print('search result is None!!!')

(2)下载xml 摘要
因为一次下载的id数目为250,在这是设置为200,需要写一个for 循环。每次循环后,time.sleep(t),如果每次休息时间一样,会认为是在爬虫,会自动断开服务器连接,最好是写一个随机函数调整time.sleep(t),模拟人在手动下载。

def get_xml(uidlist, base_url, basepath):   #根据uid下载xml
    count = len(uidlist)
    rem = count % 200  # 余数
    intrger = count // 200  # 整数
    for n in range(0, intrger+1):    #循环下载,每次200篇文献
        xrange = n * 200 + 1
        yrange = (n + 1) * 200
        out_file = open(os.path.join(basepath, str(n) + '_pubItem.xml'), 'w', encoding='utf-8')
        cur_ids = ','.join(uidlist[xrange:yrange])

        cur_url = base_url + '&id=' + cur_ids + '&rettype=abstract&retmode=xml'
        cur_data = requests.get(cur_url).text

        for string in cur_data:
            out_file.write(string)
        t = random.uniform(10, 20)   #random sleep time
        time.sleep(t)
        print(n)
    print('complete')
    print(time.ctime())

先判断保存路径是否存在,如果不存在需要新建一个路径

def makedirfile(root):#创建文件夹
    if os.path.exists(root):
        pass
    else:
        os.makedirs(root)
        print('创建新文件夹:', root)
def downloadXML(basepath, query):
    #参数说明: basepath:保存路径; query:构成的检索字符串
    makedirfile(basepath)

    db = 'pubmed'
    base = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/'
    url = base + 'esearch.fcgi?db=' + db + '&term=' + query + '&usehistory=y'
    print(url)

    output = requests.get(url).text

    web = re.findall(r'<WebEnv>(.*?)</WebEnv>', output)[0]
    key = re.findall(r'<QueryKey>(\d+)</QueryKey>', output)[0]
    count = re.findall(r'<Count>(\d+?)</Count>', output)[0]
    print(count)

    if int(count) > 0:
        cur_url = base + 'esearch.fcgi?db=' + db + '&query_key=' + key + '&WebEnv=' + web + '&retmax=' + str(count)
        uidlist=get_udi(cur_url)            #1、获得uid

        base_url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/' + 'efetch.fcgi?' + 'db=' + db + '&WebEnv=' + web + '&query_key=' + query
        get_xml(uidlist, base_url, basepath)         #2、下载xml

(3)xml格式解析
(4)关联影响因子
(5)统计基因

相关文章

网友评论

      本文标题:2019-07-14

      本文链接:https://www.haomeiwen.com/subject/tgjbkctx.html