2009-04-03 15 views
5

Próbuję uzyskać wyniki z UniProt, która jest bazą danych białek (szczegóły nie są ważne). Próbuję użyć skryptu, który przekłada się z jednego rodzaju identyfikatora na inny. Mogłem to zrobić ręcznie w przeglądarce, ale nie mogłem tego zrobić w Pythonie.Jak mogę rozmawiać z UniProt przez HTTP w Pythonie?

W http://www.uniprot.org/faq/28 jest kilka przykładowych skryptów. Próbowałem Perla i wygląda na to, że działa, więc problemem są moje próby w Pythonie. The (roboczy) skrypt jest:

## tool_example.pl ## 
use strict; 
use warnings; 
use LWP::UserAgent; 

my $base = 'http://www.uniprot.org'; 
my $tool = 'mapping'; 
my $params = { 
    from => 'ACC', to => 'P_REFSEQ_AC', format => 'tab', 
    query => 'P13368 P20806 Q9UM73 P97793 Q17192' 
}; 

my $agent = LWP::UserAgent->new; 
push @{$agent->requests_redirectable}, 'POST'; 
print STDERR "Submitting...\n"; 
my $response = $agent->post("$base/$tool/", $params); 

while (my $wait = $response->header('Retry-After')) { 
    print STDERR "Waiting ($wait)...\n"; 
    sleep $wait; 
    print STDERR "Checking...\n"; 
    $response = $agent->get($response->base); 
} 

$response->is_success ? 
    print $response->content : 
    die 'Failed, got ' . $response->status_line . 
    ' for ' . $response->request->uri . "\n"; 

moje pytania są następujące:

1) W jaki sposób można to zrobić w Pythonie?

2) Czy będę w stanie znacząco "skalować" to (tj. Użyć wielu wpisów w polu zapytania)?

+0

dodaj swój kod Pythona próba – nosklo

+0

To dość dużo otwierając tym samym adresem co bym w przeglądarce, z urllib2.urlopen. –

Odpowiedz

8

pytanie nr 1:

Można to zrobić za pomocą urllibs Pythona:

import urllib, urllib2 
import time 
import sys 

query = ' '.join(sys.argv) 

# encode params as a list of 2-tuples 
params = (('from','ACC'), ('to', 'P_REFSEQ_AC'), ('format','tab'), ('query', query)) 
# url encode them 
data = urllib.urlencode(params)  
url = 'http://www.uniprot.org/mapping/' 

# fetch the data 
try: 
    foo = urllib2.urlopen(url, data) 
except urllib2.HttpError, e: 
    if e.code == 503: 
     # blah blah get the value of the header... 
     wait_time = int(e.hdrs.get('Retry-after', 0)) 
     print 'Sleeping %i seconds...' % (wait_time,) 
     time.sleep(wait_time) 
     foo = urllib2.urlopen(url, data) 


# foo is a file-like object, do with it what you will. 
foo.read() 
+0

Obawiam się, że to nie działa (nawet po zastąpieniu tego '=' przez '==') ... Dzięki. :) –

1

Załóżmy, że używasz Python 2.5. Możemy użyć httplib aby wywołać bezpośrednio na stronę:

import httplib, urllib 
querystring = {} 
#Build the query string here from the following keys (query, format, columns, compress, limit, offset) 
querystring["query"] = "" 
querystring["format"] = "" # one of html | tab | fasta | gff | txt | xml | rdf | rss | list 
querystring["columns"] = "" # the columns you want comma seperated 
querystring["compress"] = "" # yes or no 
## These may be optional 
querystring["limit"] = "" # I guess if you only want a few rows 
querystring["offset"] = "" # bring on paging 

##From the examples - query=organism:9606+AND+antigen&format=xml&compress=no 
##Delete the following and replace with your query 
querystring = {} 
querystring["query"] = "organism:9606 AND antigen" 
querystring["format"] = "xml" #make it human readable 
querystring["compress"] = "no" #I don't want to have to unzip 

conn = httplib.HTTPConnection("www.uniprot.org") 
conn.request("GET", "/uniprot/?"+ urllib.urlencode(querystring)) 
r1 = conn.getresponse() 
if r1.status == 200: 
    data1 = r1.read() 
    print data1 #or do something with it 

Następnie można utworzyć funkcję wokół tworząc ciąg kwerendy i powinno być dalej.

+1

To niestety ma taki sam efekt jak moje inne próby - zawieszanie się na kilka minut. Ponadto, jest to "GET", który według mojego zrozumienia ogranicza go tylko do rozmiaru adresu URL. –

+0

Myślę, że to jest punkt wartości granicznych i kolumn zapytania, nie wiedząc, co wracam, nie mogę dać dobrych wartości dla tych. GET ogranicza to, co wysyłasz, a nie to, co otrzymujesz. –

1

Prawdopodobnie lepiej użyć usługi przekierowania identyfikatora białka z EBI, aby przekonwertować jeden zestaw identyfikatorów na inny. Ma bardzo dobry interfejs REST.

http://www.ebi.ac.uk/Tools/picr/

Powinienem również wspomnieć, że UniProt dysponuje bardzo dobrymi webservices. Chociaż jeśli z jakiegoś powodu jesteś zmuszony do korzystania z prostych żądań http, prawdopodobnie nie jest to przydatne.

0

Jest to pakiet python w pip, który robi dokładnie to, co chcesz

pip install uniprot-mapper 
0

w uzupełnieniu O.rka odpowiedź:

Pytanie 1:

from bioservices import UniProt 
u = UniProt() 
res = u.get_df("P13368 P20806 Q9UM73 P97793 Q17192".split()) 

Zwraca dataframe wszelkie informacje na temat każdego wpisu.

Pytanie 2: ta sama odpowiedź. To powinno się zwiększyć.

Zastrzeżone: Jestem autorem Bioservices