2017-01-19 3 views
3

Ich bin ein Biologe mit ein wenig Programmiererfahrung in Python. Eine meiner Forschungsmethoden beinhaltet das Profilieren großer Genlisten unter Verwendung dieser Datenbank: https://david.ncifcrf.gov/ Kann mir jemand sagen, ob es möglich wäre, eine Stichwortsuche der Ausgabe durchzuführen und den mit dem Schlüsselwort verbundenen Gennamen zurückzugeben? Dies ist für die Ausgabe "Table", die so aussieht: https://david.ncifcrf.gov/annotationReport.jsp?annot=59,12,87,88,30,38,46,3,5,55,53,70,79&currentList=0 Es gibt auch Back-End-und API-Optionen. Alle Einblicke und Ratschläge werden sehr geschätzt.Hinweis zur Automatisierung der Datenerfassung mit Python

+0

Wenn es eine offene API gibt, sollten Sie diese verwenden, bevor Sie in Web Scraping suchen. Auch https://david.ncifcrf.gov/annotationReport.jsp?annot=59,12,87,88,30,38,46,3,5,55,53,70,79¤tList=0 funktioniert nicht für mich. –

+0

Erfüllen API-Beschränkungen Ihre Anforderungen? Weniger als 400 Gene, Begrenzung der URL-Eingabe auf 2048 Zeichen, 200 Anfragen pro Tag? Wie für andere Frage mit Keyword Search Link, die Sie bereitgestellt haben scheint nicht zu funktionieren (Sitzung abgelaufen) –

+0

FYI, der zweite Link, den Sie gaben, ist gebrochen. – Petar

Antwort

0

Wenn es eine API gibt, die Ihnen alle Daten liefert, können Sie fast alles, was damit verbunden ist, automatisieren. APIs sind entweder REST oder SOAP, also müssen Sie zuerst herausfinden, was Sie brauchen.

Wenn die API ist RESTful:

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 

wenn die API SOAP ist, wird es ein bisschen schwieriger. Was ich empfehle ist zeep. Wenn das nicht möglich ist, weil Ihr Server 2.6 ist oder weil mehrere Personen daran arbeiten, verwenden Sie suds.

mit Schaum ein API-Aufruf sieht wie folgt aus:

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() 

Sie xml erhalten im Gegenzug so i beautifulsoup verwenden, um die Ergebnisse zu beschönigen:

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

Ok, so dass die API Verbindungsteil abgedeckt ist , wo speichern Sie Ihre Daten und wo durchlaufen Sie diese Daten, um eine Stichwortsuche durchzuführen? In deiner Datenbank. Ich empfehle MySQLdb. Richten Sie Ihre Tabelle ein und überlegen Sie, welche Informationen (die Sie von der API erfassen) in welcher Spalte gespeichert werden.

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() 

Also das ist, wo Sie Ihre Keywords festlegen (auch sie über eine andere SQL tun könnte) und vergleichen Sie die Ergebnisse, die Sie aus Ihrer Datenbank mit einer Liste, dict, Text-Datei oder hartcodierte Schlüsselwörter extrahieren und definieren, was ist, wenn sie tun match etc :)

+0

Vielen Dank für Ihre Hilfe. Ich werde dich wissen lassen, wie es läuft. – AnnaD

+0

Wenn diese Antwort Ihnen geholfen hat, denken Sie bitte darüber nach, es als Antwort anzunehmen. –

Verwandte Themen