Как я могу общаться с UniProt через HTTP в Python? - PullRequest
5 голосов
/ 04 апреля 2009

Я пытаюсь получить некоторые результаты от UniProt, которая является базой данных белка (детали не важны). Я пытаюсь использовать какой-то скрипт, который переводит с одного вида ID на другой. Я смог сделать это вручную в браузере, но не смог сделать это в Python.

В http://www.uniprot.org/faq/28 есть несколько примеров сценариев. Я попробовал Perl, и он, кажется, работает, так что проблема в моих попытках Python. (Рабочий) скрипт:

## 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";

Мои вопросы:

1) Как бы вы сделали это в Python?

2) Смогу ли я массово "масштабировать" это (т.е. использовать много записей в поле запроса)?

Ответы [ 6 ]

8 голосов
/ 04 апреля 2009

вопрос № 1:

Это можно сделать с помощью urllibs в python:

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()
1 голос
/ 25 января 2018

в дополнение к ответу О.рка:

Вопрос 1:

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

Возвращает фрейм данных со всей информацией о каждой записи.

Вопрос 2: тот же ответ. Это должно увеличиться.

Отказ от ответственности : я являюсь автором биосервисных услуг

1 голос
/ 05 августа 2016

проверить это bioservices. они связывают много баз данных через Python. https://pythonhosted.org/bioservices/_modules/bioservices/uniprot.html

conda install bioservices --yes
1 голос
/ 08 сентября 2009

Возможно, вам лучше воспользоваться службой перекрестных ссылок идентификатора белка из EBI для преобразования одного набора идентификаторов в другой. У него очень хороший интерфейс REST.

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

Я должен также упомянуть, что UniProt имеет очень хорошие доступные веб-сервисы. Хотя, если по какой-то причине вы привязаны к использованию простых http-запросов, это, вероятно, бесполезно.

1 голос
/ 04 апреля 2009

Предположим, что вы используете Python 2.5. Мы можем использовать httplib для прямого вызова веб-сайта:

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

Затем вы можете создать функцию для создания строки запроса, и вы должны быть в стороне.

0 голосов
/ 10 марта 2014

В pip есть пакет python, который делает именно то, что вы хотите

pip install uniprot-mapper
...