美文网首页
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