(Python)オープンアクセス論文の要旨をAPIから取得する
Pythonのurllibパッケージを用いて、DOAJのAPIを介したオープンアクセスジャーナル(OA)の論文情報の検索を行います。DOAJのAPIの仕様につきましては公式のドキュメントをご一読ください。
今回は学名から「論文タイトル」「論文URL」「要旨」を取得します。
- DOAJ …オープンアクセスジャーナルを、雑誌横断的に検索可能なサイト
なお、今回のような外部のサーバーと接続するケースで、ループ処理のように短時間で連続的に応答を要求する際には、time.sleep()で中断を挟むなど、相手のサーバーに過度な負担がかからないようにご留意ください。
index
ここからWordCloudで可視化したい場合には、[(Python)オープンアクセス論文の要旨からWordCloudを作成]をご参照ください。
コード全体
動作環境:
- python 3.6.8
- windows10 64bit
input | output |
---|---|
学名 | output.csv |
import urllib.request, json, csv
sciname = 'escherichia coli'
size = 5
with open('output.csv', 'w', encoding='UTF-8', newline='') as csv_file:
writer = csv.writer(csv_file)
fieldnames = ['Title', 'Link', 'Abstract']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
url = 'https://doaj.org/api/v1/search/articles/'+sciname+'?pageSize='+str(size)
res = urllib.request.urlopen(url)
res_json = json.loads(res.read().decode('utf8'))
size_int = int(size)
for i in range (size_int):
try:
title = res_json['results'][i]['bibjson']['title']
link = res_json['results'][i]['bibjson']['link'][0]['url']
abst = res_json['results'][i]['bibjson']['abstract']
writer.writerow({'Title':title, 'Link':link, 'Abstract':abst})
except (KeyError, IndexError, UnicodeEncodeError) as e:
print(e)
pass
2021/05/16追記
APIがv1からv2に更新されていますが、基本的な利用方法に変更はありません。
ご利用の際はURLのv1をv2に変更してください。
重要な箇所を以下に示します。
検索条件
sciname = 'escherichia coli'
大腸菌の学名(Escherichia coli)をscinameに格納しています。
DOAJのAPIでは、URLにパラメータを指定することで検索条件を変更することができます。例えば、上記のコードでは、size = 5を先に宣言しておき、
url = 'https://doaj.org/api/v1/search/articles/'+sciname+'?pageSize='+str(size)
とすることで、検索結果から5件のみの情報を得ることができます。同時に、scinameを入れて検索語句を指定します。
このパラメータを変更することで取得できる件数を変更できますが、相手先のサーバーに過度な負担がかからないようご注意ください。
pageSizeのほかにも、ソートするためのsortなどが用意されています。
レスポンス処理
for i in range (size_int):
try:
title = res_json['results'][i]['bibjson']['title']
link = res_json['results'][i]['bibjson']['link'][0]['url']
abst = res_json['results'][i]['bibjson']['abstract']
writer.writerow({'Title':title, 'Link':link, 'Abstract':abst})
except (KeyError, IndexError, UnicodeEncodeError) as e:
print(e)
pass
jsonの中に各情報が格納されているため、ループで取り出します。
検索ワードによっては、指定したsizeより少ない件数が得られる場合もあります。そのため、KeyError, IndexError, UnicodeEncodeErrorの3つをエラー処理としてエラー内容を出力するようにしています。
特にWindwosの場合は、CP932がエンコードとデコードの関係でエラーの原因になる場合があるため、あらかじめcsvファイルを作成するときに
with open('output.csv', 'w', encoding='UTF-8', newline='') as csv_file:
として、エンコードをUTF-8に指定しておきます。
そのようにしない場合、論文情報に含まれる文字によっては、
'cp932' codec can't encode character '\xe0' in position 142: illegal multibyte sequence
のエラーが返されます。
出力
これにより得られる出力は以下の通りです。全体的に長くなるため、途中で省略(…)しています。
Title Link Abstract
Analysis of Distribution... https://e-journal... Fresh milk was one of ...
Identification of protec... http://europepmc.... Mucosal or parenteral ...
Lignocellulosic Fermenta... http://dx.doi.org... Simultaneous saccharif...
Indagine epidemiologica ... http://www.pagepr... Background: Urinary tr...
Biosynthesis of rare 20(... http://www.scienc... Background: Ginsenosid...
一部文字化けをしている箇所がありましたが、全体として目的の論文情報が得られました。
次:[(Python)オープンアクセス論文の要旨からWordCloudを作成]
関連項目