home about terms twitter

(Python)オープンアクセス論文の要旨をAPIから取得する

date: 2020-02-16 | mod: 2021-05-17

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を作成]

関連項目