はじめに
自分用の覚書記事です。
以前の記事で、pubmedから取得したxml形式の論文データを解析するためのpythonクラスを作成しました。
このときはxml形式のデータをpubmedのページから簡単に入手できたのですが、ウエブページが変更されて、簡単に入手できるのがPubmed idだけになってしまいました。
本記事では、Pubmed idのリストから、xml形式の論文データを入手するpythonスクリプトについて記述します。
E-utilities
E-utilitiesについてはこちらに記事があります(英語)。E-utilitiesは、NCBIデータベースが提供するAPIです。
NCBIからprogram的にデータを入手するには、このAPIのお世話になる必要がありそうです。
ブラウザ経由でデータを入手するには、https://eutils.ncbi.nlm.nih.gov/entrez/eutils/ 以下にある各種fcgiにアクセスすれば良いようです。ただし、1秒間に3回以上アクセスするなということで、これを守らないとアクセス元ネットワークからのアクセスを遮断されてしまうこともあるかもしれません。同僚に迷惑をかけないように注意しましょう。
例えば2件のpubmedデータをxml形式でブラウザ越しに取得するには以下のURLにアクセスします。
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=12345678,2345678&retmode=xml
unixからもデータベースにアクセスしやすいように、いろいろ提供されているようですが、ここでは取り扱いません。
このようにブラウザ経由などでもデータを入手できますが、この記事ではBiopythonのEntrezを利用します。
BioPythonでのデータの取得
コードは以下のようになりました。
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
from Bio import Entrez
Entrez.email = "your.e-mail.address@example.com"#名乗る
pmids = [12345678,2345678]
handle = Entrez.efetch(db="pubmed", id=pmids,retmode="xml")
content = handle.read().decode()
handle.close()
content = content.split("\n",2)[2] +"\n";#最初の2行(htmlヘッダーを取り除く)
最初の2行は、接続エラーを回避するためです。この2行を入れないと以下のエラーが出ます。
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)
https://shinespark.hatenablog.com/entry/2015/12/06/100000 に従ってこの2行を入れましたが、これがなんの処理なのかはわかりません(元記事には注意して使うよう書かれています)。
問い合わせる前に、連絡用のメールアドレスを登録する必要があるようです。
Entrez.efetch()の戻り値(handle)は、
http.client.HTTPResponseクラスのオブジェクト
handle.read()の戻り値はbytesクラスのオブジェクトです。
これを文字列に変換するには、decode()すれば良いようです。
終わりに
pmidさえ持っておけば、xmlデータを入手できるようになりました。業績リストとかを提出しなくてはいけないシーンがよくありますが、pmidだけ提出すれば良いようになればいいのに、と思います。
が、しかし、当分そうはならなさそうなので、次の記事ではpmidのリストから業績リストを作成するpythonスクリプトを書く予定です。