PythonでNCBIの情報を取得!NCBI API利用方法まとめ

NCBIの情報を取得するウェブアプリを作成した際に勉強したNCBIのAPIの利用方法をご紹介したいと思います!

APIとは?

APIとはアプリケーションプログラミングインタフェースの略で,プログラムを通して外部から機能を呼び出すことのできるシステムのことを言います!例えばTwitterのAPIではツイートを投稿したり,特定のツイートの情報を収集することができます!

今回利用するNCBIのAPIはURLを通して欲しい情報を指定して取得することができます!
例えば「データベースはPubmedで,Cancerに関する論文の情報を取得する」ということがPythonのプログラムを通して自動的に実行することができます!

PythonからのAPI利用方法

PythonからNCBIのAPIを利用する手順は以下になります.(基本的には他のAPIも同様です)

  1. 欲しい情報を指定するURLを文字列として構築する
  2. 構築したURLにアクセスする
  3. 返ってきた結果をダウンロードしたり処理したりする

利用するパッケージはurllibとBeautifulSoupです.urllibは構築したURLにアクセスするため,BeautifulSoupは返ってくる結果がXMLなどの時に欲しい情報を抽出するために使用します.

NCBIで利用可能な機能

以下を参照しています.
https://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.ESearch

  • Esearch:検索ワードに合致する各種ID(Gene IDなど)を返してくれる
  • Esummary:各種IDを投げるとドキュメントサマリーを返してくれる
  • Elink:あるデータベースのIDを投げるとそのIDに紐づいた別データベースのIDを返してくれる(Gene IDをProtein IDに変換するなど)
  • Epost:History Serverに各種IDをアップロードする
  • Einfo:利用可能なデータベースのリストや各データベースの統計情報(何件情報が登録されているかなど)を取得できる
  • Espell:検索をかけたワードの別の選択肢を提示してくれる(Googleのもしかして的な機能)

以下で例として一つ,Esearchの利用方法をご紹介します.

Esearchの利用方法

ベースURL: https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi

上記のベースURLに各種パラメータをくっつけて行って,クエリ用のURLを構築していきます!

必須パラメータ

db :検索するデータベースを指定します.デフォルトはpubmedです.選択肢は以下の表中のデータベース名です.https://www.ncbi.nlm.nih.gov/books/NBK25497/table/chapter2.T._entrez_unique_identifiers_ui/

term:検索をかける語句を指定します.Googleの検索バーに入力する語句みたいなものだと考えればOKです.

例:pubmedでasthmaに関する論文を検索したい
db=pubmed
term=asthma
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=asthma

任意パラメータ

retmax:結果を何件表示するか?
retmode:返してもらう結果の形式.xml または json
field:検索語句をどの領域で検索するか?[MeSH Terms],[All Fields]など
idtype:配列情報のデータベースを検索する際にどのIDで検索を行うかを指定する.(nuccore, nucest, nucgss, popset, protein)

過去の検索結果を利用する際のパラメータ

以下の例で利用します.自分が過去に行ったクエリの結果を利用したいとき(データベース間のID変換など)に非常に便利です!

  • usehistory
  • WebEnv
  • query_key

実例

以下の4つの例をご紹介したいと思います!どれも簡単に利用できてかつ,汎用性があるものだと思います!コピペして各種パラメータを変更すればそのまま応用できますのでぜひご利用ください!

  1. 検索ワードでヒットする論文のドキュメントサマリーを取得したい!→(ESearch – ESummary/EFetch)
  2. Protein IDをGene IDに変換して遺伝子のドキュメントサマリーを取得したい!→(ELink – ESummary/Efetch)
  3. Gene IDをAccession Numberに変換したい!
  4. Accession Numberから配列情報をFASTA形式で取得したい!

例1.検索ワードでヒットする論文のドキュメントサマリーを取得したい!→(ESearch – ESummary/EFetch)

import urllib.request
from bs4 import BeautifulSoup

#asthmaに関する2009年に出版された論文をPubmedで検索→ 対応するPMIDが取得できる
search_term='asthma[mesh]+AND+leukotrienes[mesh]+AND+2009[pdat]'
base='https://eutils.ncbi.nlm.nih.gov/entrez/eutils/'
query_url=base+"esearch.fcgi?db=pubmed&term={}&RetMax=2&usehistory=y".format(search_term)
print(query_url)
data = urllib.request.urlopen(query_url)
xml=data.read()
soup=BeautifulSoup(xml, "xml")
print(soup)

#QueryKeyとWebEnvを抽出する(今回の検索結果を次の段階で使用するために必要)
QueryKey=soup.find("QueryKey").text
WebEnv=soup.find("WebEnv").text
print("QueryKey= ",QueryKey)
print("WebEnv= ",WebEnv)

#上の検索で取得したPMIDそれぞれのドキュメントサマリーを取得する
query_url=base+"esummary.fcgi?db=pubmed&query_key={}&WebEnv={}&RetMax=2&rettype=abstract&retmode=text".format(QueryKey,WebEnv)
print(query_url)
data = urllib.request.urlopen(query_url)
xml=data.read()
soup=BeautifulSoup(xml, "xml")
print(soup)

例2.Protein IDをGene IDに変換して遺伝子のドキュメントサマリーを取得したい!→(ELink – ESummary/Efetch)

import urllib.request
from bs4 import BeautifulSoup

db1 = 'protein'  
db2 = 'gene'    
linkname = 'protein_gene'; # desired link &linkname
#input UIDs in $db1 (protein GIs)
id_list = '194680922,50978626,28558982,9507199,6678417';

#assemble the elink URL
base = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/'
query_url=base+ "elink.fcgi?dbfrom={}&db={}&id={}".format(db1, db2, id_list)
query_url += "&linkname={}&cmd=neighbor_history".format(linkname)
print(query_url)

data = urllib.request.urlopen(query_url)
xml=data.read()
soup=BeautifulSoup(xml, "xml")
print(soup)

QueryKey=soup.find("QueryKey").text
WebEnv=soup.find("WebEnv").text
print("QueryKey= ",QueryKey)
print("WebEnv= ",WebEnv)

query_url=base+"esummary.fcgi?db={}&query_key={}&WebEnv={}".format(db2, QueryKey,WebEnv)
print(query_url)
data = urllib.request.urlopen(query_url)
xml=data.read()
soup=BeautifulSoup(xml, "xml")
print(soup)

例3.Gene IDをAccession Numberに変換したい!

import urllib.request
from bs4 import BeautifulSoup

gi_list = ['24475906','224465210','50978625','9507198']

base = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/'
query_url = base+"efetch.fcgi?db=nucleotide&id={}&rettype=acc".format(",".join(gi_list))
query_url
urllib.request.urlretrieve(query_url,"sequence.acc")

例4.Accession Numberから配列情報をFASTA形式で取得したい!

acc_list = 'NM_009417,NM_000547,NM_001003009,NM_019353'
query="".join([i+"[accn]"+ "+OR+" for i in acc_list.split(",")]).strip("+OR+$")

query_url = base + "esearch.fcgi?db=nuccore&term={}&usehistory=y".format(query)
query_url
print(query_url)
data = urllib.request.urlopen(query_url)
xml=data.read()
soup=BeautifulSoup(xml, "xml")
print(soup)
QueryKey=soup.find("QueryKey").text
WebEnv=soup.find("WebEnv").text
print("QueryKey= ",QueryKey)
print("WebEnv= ",WebEnv)

query_url2 = base + "efetch.fcgi?db=nuccore&query_key={}&WebEnv={}&rettype=fasta&retmode=text".format(QueryKey, WebEnv)
query_url2
print(query_url2)
urllib.request.urlretrieve(query_url2,"test.fasta")

Tips Serach Detailを参照しよう!

Esearchを利用する際にtermってどう指定したらいいのか分からないですよね.そんな時はNCBIのサイトで一度,自分の手で検索してみて下さい!
以下ではPubmedでbreadt cancerの直近5年の論文を検索しています.

するともう少し下の方にSearch Detailという項目があります!

ここに検索がどのようなtermで行われたのかの詳細が記載されています!ですのでこのSerach Detailを参照すれば 苦労してtermを構築する必要がなくなります!

参照

https://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.ESearch
https://www.ncbi.nlm.nih.gov/books/NBK25498/#chapter3.EPost__ESearch
https://www.ncbi.nlm.nih.gov/books/NBK25497/table/chapter2.T._entrez_unique_identifiers_ui/
https://www.ncbi.nlm.nih.gov/books/NBK25497/#chapter2.chapter2_table1




NO IMAGE
最新情報をチェックしよう!