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)统计基因
网友评论