【发布时间】:2017-11-20 04:35:40
【问题描述】:
我想下载大约 2000 个 Pubmed ID 的大型科学摘要数据。我的 python 代码很草率,而且工作起来似乎很慢。有没有什么快速有效的方法来收获这些摘要?
如果这是最快的方法,我该如何衡量它,以便我能够与其他人或家庭与工作情况进行比较(不同的 ISP 可能会影响速度)?
在下面附上我的代码。
import sqlite3
from Bio.Entrez import read,efetch,email,tool
from metapub import PubMedFetcher
import pandas as pd
import requests
from datetime import date
import xml.etree.ElementTree as ET
import time
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Abstract_data = pd.DataFrame(columns=["name","pmid","abstract"])
def abstract_download(self,dict_pmids):
"""
This method returns abstract for a given pmid and add to the abstract data
"""
index=0
baseUrl = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/"
for names in dict_pmids:
for pmid in dict_pmids[names]:
try:
abstract = []
url = baseUrl+"efetch.fcgi?db=pubmed&id="+pmid+"&rettype=xml"+
response=requests.request("GET",url,timeout=500).text
response=response.encode('utf-8')
root=ET.fromstring(response)
root_find=root.findall('./PubmedArticle/MedlineCitation/Article/Abstract/')
if len(root_find)==0:
root_find=root.findall('./PubmedArticle/MedlineCitation/Article/ArticleTitle')
for i in range(len(root_find)):
if root_find[i].text != None:
abstract.append(root_find[i].text)
if abstract is not None:
Abstract_data.loc[index]=names,pmid,"".join(abstract)
index+=1
except:
print "Connection Refused"
time.sleep(5)
continue
return Abstract_data
编辑:此脚本出现的一般错误似乎是“连接被拒绝”。请参阅下面的 ZF007 的答案是如何解决的。
【问题讨论】:
-
我投票结束这个问题,因为它似乎更适合 biostars.org 或 bioinformatics.stackexchange.com
-
@Stedy 这个问题虽然缺少一些信息作为导入的模块和错误或显示的代码问题,但似乎是一个
requests问题。生物环境是次要的,因此在 IMO 堆栈溢出中占有一席之地。 -
@Nishal 您能否将导入的模块添加到您的问题中,以及您的代码似乎有什么错误/问题?
-
@rodgdor 是的,很好的观察
-
如果您有所有 ID 的列表,只需发出一个 POST 请求,其中 ID 作为分号分隔的字符串。参考:ncbi.nlm.nih.gov/books/NBK25499,搜索
UID list。