如何从发布的数据ncbi

时间:2015-11-04 10:26:26

标签: ncbi pubmed

我想下载所有发布的数据摘要。 有谁知道如何轻松下载所有发表的文章摘要?

我得到了数据来源: ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/af/12/

无论如何都要下载所有这些tar文件..

提前致谢。

2 个答案:

答案 0 :(得分:3)

有一个名为rentrez https://ropensci.org/packages/的软件包。看一下这个。您可以通过特定关键字或PMID等检索摘要。我希望它有所帮助。

更新:您可以通过以下代码传递IDS列表来下载所有摘要。

    library(rentrez)
    library(xml)

your.ids <- c("26386083","26273372","26066373","25837167","25466451","25013473")
# rentrez function to get the data from pubmed db
fetch.pubmed <- entrez_fetch(db = "pubmed", id = your.ids,
                      rettype = "xml", parsed = T)
# Extract the Abstracts for the respective IDS.  
abstracts = xpathApply(fetch.pubmed, '//PubmedArticle//Article', function(x)
                               xmlValue(xmlChildren(x)$Abstract))
# Change the abstract names with the IDS.
names(abstracts) <- your.ids
abstracts
col.abstracts <- do.call(rbind.data.frame,abstracts)
dim(col.abstracts)
write.csv(col.abstracts, file = "test.csv")

答案 1 :(得分:0)

我很欣赏这是一个有点老问题。

如果您希望使用python获取所有发布的条目,我前一段时间编写了以下脚本:

import requests
import json

search_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&mindate=1800/01/01&maxdate=2016/12/31&usehistory=y&retmode=json"
search_r = requests.post(search_url)
search_data = search_r.json()
webenv = search_data["esearchresult"]['webenv']
total_records = int(search_data["esearchresult"]['count'])
fetch_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmax=9999&query_key=1&webenv="+webenv

for i in range(0, total_records, 10000):
    this_fetch = fetch_url+"&retstart="+str(i)
    print("Getting this URL: "+this_fetch)
    fetch_r = requests.post(this_fetch)
    f = open('pubmed_batch_'+str(i)+'_to_'+str(i+9999)+".json", 'w')
    f.write(fetch_r.text)
    f.close()

print("Number of records found :"+str(total_records))

首先在两个日期之间制作一个entrez / eutils搜索请求,这可以保证捕获所有发布的日期。然后从该响应中检索'webenv'(保存搜索历史)和total_records。使用webenv功能可以节省必须将各个记录ID传递给efetch调用。

获取记录(efetch)只能在10000个批次中完成,for循环处理抓取9,999个批次的记录并将其保存在标记文件中,直到检索到所有记录。

请注意,请求可能会失败(非200个http响应,错误),在更强大的解决方案中,您应该将每个requests.post()包装在try / except中。在转储/使用数据到文件之前,您应该确保http响应具有200状态。