gBizINFOから法人情報APIを取得してみる

# 概要
* 何がしたいか：複数の法人の情報（事業概要、資本金、従業員数、企業HP etc. ）を機械的に入手したい
  * 使い道：企業情報のリサーチ、特許調査、財務分析 etc. 
* どうやるか：[gBizINFO](https://info.gbiz.go.jp/)というサイトで、法人情報のAPIが公開されているらしい。

# gBizINFOとは

>法人として登記されている約400万社を対象とし、法人番号、法人名、本社所在地に加えて、府省との契約情報、表彰情報等の政府が保有し公開している法人活動情報を本サイトで一括検索、閲覧できます。
>> https://info.gbiz.go.jp/about/index.html

### 得られる法人情報の詳細

>https://info.gbiz.go.jp/hojin/common/data/resourceinfo.pdf;jsessionid=92A8F321A874042AF918672302B62479

* 法人基本情報
  * 法人代表者名、資本金、従業員数（全体/男性/女性）、営業品目（業種）、事業概要、企業HP、設立年 etc. 
* 届出認定 / 表彰 / 補助金 / 調達 / 特許 / 財務 / 職場　情報

→今回は法人基本情報を取得した。

### APIの種類
* SPARQL APIとREST APIの2種類が提供されているらしい。https://info.gbiz.go.jp/api/index.html

→今回はREST APIを取得することにした。





# 環境
### 開発環境
下記の素人3点セット。

* Windows10
* Python3.6.3 (Anaconda)
* jupyter notebook

### インストールが必要なモジュール
requestsモジュール
https://qiita.com/hththt/items/14bfc2bf23192b020371

（必要あれば）tqdmモジュール
https://knknkn.hatenablog.com/entry/2020/05/24/095438

# 法人情報を取得してみる
### 法人番号のリストを作成
法人番号を知っていた法人を適当にリスト化（input.xlsx）。

| 法人番号 | 法人名 |
|:-:|:-:|
|9010401014127	|株式会社ジャニーズ事務所|
|9011001029597	|東日本旅客鉄道株式会社|
|1010601016863	|ライオン株式会社|
|3120001077469	|株式会社竹中工務店|
|5010701000940	|いすゞ自動車株式会社|
|3120001136159	|サントリーホールディングス株式会社|
|6010005007397	|国立大学法人東京医科歯科大学|
|9011001029597	|東日本旅客鉄道株式会社|
|1020001071491	|富士通株式会社|


### gBizINFOへのAPIアクセストークンを取得

>情報提供REST APIの利用にあたっては、利用申請により発行されたアクセストークンの設定が必要です。

とのこと（https://info.gbiz.go.jp/api/index.html ）なので、利用申請してトークンを取得。

### モジュールのインポート
```python:get_gbizinfo_api.ipynb
import json
import pandas as pd
import requests
import numpy as np
from tqdm.autonotebook import tqdm #notebookで使うときのtqdm
#from tqdm import tqdm #スクリプト化したときのtqdm
```

### 設定が必要な情報
```python:get_gbizinfo_api.ipynb
raw_data_file_name = 'input.xlsx' #法人番号リストファイル名(Excel)
token = '********************' #APIにアクセスするためのトークン
columns = ['name','capital_stock','employee_number','business_summary','company_url'] #ほしい法人基本情報
           #法人名、資本金、従業員数、事業概要、企業HP
output_file_name = 'output.xlsx'#法人情報を紐づけた出力ファイル名(Excel)
```
### 元データのクレンジング
```python:get_gbizinfo_api.ipynb
raw_data = pd.read_excel(raw_data_file_name,encoding='cp932') #元データの読み込み
corp_num_series = raw_data['法人番号'].fillna(-1).astype(np.int64) #法人番号の列のみ抽出、int型に変換（法人番号がnullの場合は-1で補完し、行を維持しつつ実質的にAPIが返ってこないようにする）
```
### 法人基本情報APIを取得し、元データに紐づけるプログラム

```python:get_gbizinfo_api.ipynb
class CorporateInformation:
    def __init__(self,token):
        self.headers = {
            "Accept": "application/json",
            "X-hojinInfo-api-token": token #APIにアクセスするためのトークン
        }
        self.endpoint_url = 'https://info.gbiz.go.jp/api/v1/hojin/' #法人情報提供のエンドポイント

    def _get_corporate_information(self,corp_num_series): #法人番号をキーに、法人基本情報を取得し出力

        results = [] #複数法人の法人基本情報（辞書型）を格納するリスト（df型だと処理時間かかるためリストで対応）
        for corp_num in tqdm(corp_num_series): #法人番号ごとに、法人基本情報を取得、格納
              
            try: #法人番号が入力されている/apiにtimeout秒以内にアクセスできる
                res = requests.get(
                    url = self.endpoint_url+str(corp_num), #https://info.gbiz.go.jp/api/v1/hojin/{corporateNumber}
                    headers = self.headers, # {"Accept", "X-hojinInfo-api-token"}
                    timeout = 10
                )
                corp_info = res.json()['hojin-infos'][0] #法人基本情報のdictを取得
                results.append(corp_info)
            except: #法人番号を入力されていない/apiにtimeout秒以内にアクセスできない
                results.append({}) #法人番号が欠損している企業のレコードとして、空のリストを追加する
    
        df = pd.DataFrame.from_dict(results) #法人名をインデックスに法人基本情報をdf化
        return df
    
    def _merge(self,raw_data,df_corp_info,columns): #必要な法人基本情報だけ抜き出して、元データに紐づけ
        return pd.concat([raw_data,df_corp_info[columns]],axis=1)
```

### APIの取得、元データへ紐づけ、出力

```python:get_gbizinfo_api.ipynb
corp_info = CorporateInformation(token=token) #法人情報取得のためのインスタンス作成

df_corp_info = corp_info._get_corporate_information(corp_num_series) #法人基本情報apiを取得(df形式)

df_output = corp_info._merge(raw_data,df_corp_info,columns) #元データに必要な法人基本情報をマージ

df_output.to_excel(output_file_name) #excel形式で出力
```

# 出力結果
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186742/685ee600-7475-9690-49c7-3f3b65324105.png)

* C~H列がAPI取得したデータ。
* G列の"business_summary"の情報は法人によって濃淡あり。
* 大企業でも必ずしもデータが入っているわけではない。
* データの時点は下記とのこと。　https://info.gbiz.go.jp/faq/index.html

>原則としてgBizINFOが運用開始した平成28年１月以降に収集したデータとなります。また日付情報については、契約情報の契約日や届出・認定の認定日など①「各情報に由来する起点日」と②「gBizINFOへの登録日」の2種類となります。
①については「認定日」「契約日」など画面各項目に日付データを掲載しており、これらは各府省庁から提供される情報に起因します。
➁については、法人番号公表サイト、全省庁統一資格、しょくばらぼ、EDINETの４サイトからのデータ取得分は、APIにて日次でデータ取得・更新を行っており、それらの日付データは各法人のプロフィール画面下にある出典元情報に記載しており、それ以外の登録日付データはCSVおよび各APIにて取得できます。


# Future Work
特許情報の調査や財務情報の分析のための情報取得もしてみたい。

# Reference
https://qiita.com/kosei_KB/items/103b5e9bc60b33ca4d26