2017-01-19 27 views
3

我是一位在Python中具有一点编程经验的生物学家。我的一个研究方法涉及使用此数据库分析大型基因列表:https://david.ncifcrf.gov/ 任何人都可以告知我是否可以对输出进行关键字搜索并返回与关键字相关的基因名称?这是用于看起来如此的“表格”输出:https://david.ncifcrf.gov/annotationReport.jsp?annot=59,12,87,88,30,38,46,3,5,55,53,70,79&currentList=0 还有后端和api选项。 非常感谢所有的见解和建议。关于使用Python自动化数据挖掘的建议

+0

如果有一个开放的API,你应该尝试在调查网络抓取之前使用它。另外https://david.ncifcrf.gov/annotationReport.jsp?annot=59,12,87,88,30,38,46,3,5,55,53,70,79¤tList=0不适用于我。 –

+0

API限制是否满足您的需求?少于400个基因,将网址输入限制为2048个字符,每天200个请求?至于关于您提供的关键字搜索链接的öhrhr问题似乎并不奏效(会话已过期) –

+0

仅供参考,您提供的第二个链接已损坏。 – Petar

回答

0

如果有一个API为您提供所有数据,则可以自动化几乎所有与之相关的数据。 API是REST或SOAP,所以首先你需要弄清楚你需要什么。

如果API是基于REST:

import urllib2, json 

url = "https://mysuperapiurl.com/api-ws/api/port/" 
u = 'APIUsername' 
p = 'APIPassword' 

def encodeUserData(user, password): 
    return "Basic " + (user + ":" + password).encode("base64").rstrip() 
req = urllib2.Request(url) 
req.add_header('Accept', 'application/json') 
req.add_header("Content-type", "application/x-www-form-urlencoded") 
req.add_header('Authorization', encodeUserData(u, p)) 
res = urllib2.urlopen(req) 
j = json.load(res) # Here is all the data from the API 
json_str= json.dumps(j) # this is the same as above as string 

如果API是SOAP,它变得有点困难。我推荐的是zeep。如果因为您的服务器为2.6或因为有多人正在处理它而无法执行此操作,请使用suds

用肥皂水API调用看起来是这样的:

import logging, time, requests, re, suds_requests 
from datetime import timedelta,date,datetime,tzinfo 
from requests.auth import HTTPBasicAuth 
from suds.client import Client 
from suds.wsse import * 
from suds import null 
from cStringIO import StringIO 
from bs4 import BeautifulSoup as Soup 

log_stream = StringIO() 
logging.basicConfig(stream=log_stream, level=logging.INFO) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 

WSDL_URL = 'http://213.166.38.97:8080/SRIManagementWS/services/SRIManagementSOAP?wsdl' 

username='username' 
password='password' 
session = requests.session() 
session.auth=(username, password) 

def addSecurityHeader(client,username,password): 
    security=Security() 
    userNameToken=UsernameToken(username,password) 
    security.tokens.append(userNameToken) 
    client.set_options(wsse=security) 

addSecurityHeader(client,username,password) 

arg1 = "argument_1" 
arg2 = "argument_2" 

try: 
    client.service.GetServiceById(arg1, arg2) 
except TypeNotFound as e: 
    print e 
logresults = log_stream.getvalue() 

,您会收到XML的回报,所以我用beautifulsoup美化结果:

soup = Soup(logresults) 
print soup.prettify() 

确定这样的API连接部分被覆盖,你在哪里存储你的数据,你在哪里迭代这些数据来执行关键字搜索?在你的数据库中。我建议MySQLdb。设置你的表,并考虑你要存储在哪个列中的什么信息(你从API中收集的信息)。

def dbconnect(): 
    try: 
     db = MySQLdb.connect(
      host='localhost', 
      user='root', 
      passwd='password', 
      db='mysuperdb' 
     ) 
    except Exception as e: 
     sys.exit("Can't connect to database") 
    return db 

def getSQL(): 
    db = dbconnect() 
    cursor = db.cursor() 
    sql = "select * from yoursupertable" 
    dta = cursor.execute(sql) 
    results = cursor.fetchall() 
    return results 

def dataResult(): 
    results = getSQL() 
    for column in results: 
     id = (column[1]) 
print dataResult() 

因此,这是您设置的关键字(也可以通过另一个SQL这样做),你从一个列表,字典,文本文件或硬编码的关键字数据库中提取的结果进行比较,并确定做什么,如果他们匹配等:) :)

+0

谢谢你的帮助。我会让你知道它是怎么回事。 – AnnaD

+0

如果这个答案对你有帮助,请考虑投票/接受答案。 –