知財のあれこれをPythonで何とかする

### 特許情報APIを何とかする
今回は特許庁が公開している特許情報APIサーバからデータをダウンロードする方法について紹介したいと思います。特許情報APIサーバがうまく活用できれば特許情報を自動的に入手できるようになりますので、J-Platpatを一件ずつキーボード操作してデータを入手するより格段に効率化が図れます。

### (特許情報APIサーバ利用時の処理手順)
特許情報APIサーバを利用する場合以下のような処理が必要です。
今回は手順ごとにプログラムをpart1,part2に分け、それぞれを説明します。
![仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/49ddf98c-a585-5470-f7f8-87d7899c6924.png)

### （part1）アクセストークンを取得する
特許情報APIサーバにアクセスするためには、ユーザ登録申請をするとメールで送られるユーザ名、パスワードを用いて、トークン取得パスにアクセスすることでまず「アクセストークン」を取得し、「アクセストークン」と特許の出願番号を用いて所定のURLにアクセスすることで所望の情報を取得するという仕組みが採られています。
以下にアクセストークンを取得するプログラム（part1）を示しますので、part1のプログラムの「dummy_user」にユーザ名,「dummy_password」にパスワード,「https:dummy.jp/hogehoge」にトークン取得パスをそれぞれ置き換えてください。

```python:part1.py
#part1
import requests
import json

usrinf = {
    'grant_type': 'password',
    'username': 'dummy_user',#ユーザ名を入れる
    'password': 'dummy_password',#パスワードを入れる
}

response = requests.post('https://dummy.jp/hogehoge', data=usrinf)#トークン取得パスを入れる
atkn=response.json()["access_token"]
print(atkn)

f = open('atkn.txt', 'w')
f.write(atkn)
f.close()
```
part1のプログラムを実行して「atkn.txt」のテキストファイル（半角英数で1Kバイト程度）ができればアクセストークン取得成功です。

### （part2）APIサーバにアクセスして取得したデータを抽出する
次にpart2のプログラムを実行させます。今回は出願番号「2007035937」の分割出願のデータを抽出したいと思います。

```python:part2.py
#part2
import requests
import json

appnum =['2007035937']#情報を取りたい特許の出願番号

#保存したアクセストークンの読み出し
f = open('atkn.txt', 'r')
atkn = f.read()
f.close()

auth_hd = {'Authorization': 'Bearer '+atkn}

#分割出願情報に対応するAPIのURL
url='https://ip-data.jpo.go.jp/api/patent/v1/divisional_app_info/'
index=0
for i in appnum:
    response2 = requests.get(url+appnum[index], headers=auth_hd)
    #Jsonデータ表示
    jsndata0 = response2.json()
    json_data = json.dumps(jsndata0, indent=4,ensure_ascii=False)
    print(json_data)

    #Jsonから登録番号抽出
    jsndata = response2.json()['result']['data']['divisionalApplicationInformation']
    print("出願番号:",appnum[index])
    for num in jsndata:
        print("登録番号:",num['registrationNumber'])
    index +=1
    print("++++++")

```
part1,part2のプログラムを連続して実行すると、次のような実行結果が表示されます。
<details><summary><b>実行結果</b></summary>

```rb
{
    "result": {
        "statusCode": "100",
        "errorMessage": "",
        "remainAccessCount": "29",
        "data": {
            "applicationNumber": "2007035937",
            "parentApplicationInformation": {
                "parentApplicationNumber": "2000009310",
                "filingDate": "20000118"
            },
            "divisionalApplicationInformation": [
                {
                    "applicationNumber": "2000009310",
                    "publicationNumber": "413202365",
                    "ADPublicationNumber": "2001202365",
                    "nationalPublicationNumber": "",
                    "ADNationalPublicationNumber": "",
                    "registrationNumber": "3947859",
                    "internationalApplicationNumber": "",
                    "internationalPublicationNumber": "",
                    "erasureIdentifier": "01",
                    "expireDate": "20200118",
                    "disappearanceDate": "20140427",
                    "divisionalGeneration": "0"
                },
                {
                    "applicationNumber": "2007035937",
                    "publicationNumber": "419157175",
                    "ADPublicationNumber": "2007157175",
                    "nationalPublicationNumber": "",
                    "ADNationalPublicationNumber": "",
                    "registrationNumber": "4488010",
                    "internationalApplicationNumber": "",
                    "internationalPublicationNumber": "",
                    "erasureIdentifier": "01",
                    "expireDate": "20200118",
                    "disappearanceDate": "20140409",
                    "divisionalGeneration": "1"
                }
            ]
        }
    }
}
出願番号: 2007035937
登録番号: 3947859
登録番号: 4488010
++++++
```
</details>
実行結果ですが最初にAPIサーバから取得した生データを表示させています。一番下に出願番号「2007035937」とその分割出願の登録番号「3947859」「4488010」の２つが抽出できていることを確認ください。

### (プログラムのポイント１)
実行結果を見ると、APIサーバをアクセスすると取得できる生データはJSON形式となっています。
JSONデータはツリー状の階層構造になっております。そのままだと見にくいので今回part2の以下のプログラム部分で、JSONデータにインデントを付け階層構造が分かるように表示させています。
```python
    #Jsonデータ表示
    jsndata0 = response2.json()
    json_data = json.dumps(jsndata0, indent=4,ensure_ascii=False)
    print(json_data)
```
JSONデータから目視で欲しい情報（ここでは分割出願の登録番号）だけを取り出すのは大変なので、登録番号の抽出に以下のプログラム部分を使っています。

```python
    #Jsonから登録番号抽出
    jsndata = response2.json()['result']['data']['divisionalApplicationInformation']
    print("出願番号:",appnum[index])
    for num in jsndata:
        print("登録番号:",num['registrationNumber'])
```
今回のプログラム例では分割出願の登録番号を取得するように設定していますが、他のデータを取得したい場合はJSONデータの上位から下位へ階層を示す項目名を順に指定してたどっていくようにプログラムを書き直すことで希望するデータを取得できるようになります。
今回のデータでは1階層目「result」、2階層目「data」、3階層目「divisionalApplicationInformation」をたどって4階層目「registrationNumber」に到達できました。「registrationNumber」で示される登録番号は複数存在するのでfor文を使うことで全ての登録番号が取得できます。

プログラムとJSONデータの関係を以下の図に示します。
![json階層のpythonでの抽出.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/2321b271-b497-b544-039a-98b72caf1c3f.jpeg)
以上の例を参考にして、別の情報が取りたい場合はpart2を実行してまず表示されるJSONデータをチェックしてください。アクセスしようとする情報の「階層」「項目名」「データの個数」を確認してそれに応じてプログラムを書き換えることで所望のデータが取り出せるようになります。

### (プログラムのポイント２)
分割出願以外にも取りたい情報の種類に応じてプログラム中の「url」を書き換えればアクセスできます。
(例)経過情報
```python
url='https://ip-data.jpo.go.jp/api/patent/v1/app_progress/'
```
出願番号を追加すれば複数の特許の情報が取得できます。
```python
appnum =['2007035937','2018219069']
```
### (注意事項)
part2の実行はpart1を実行してから1時間以内にしてください。（アクセストークンに有効期限があるため）
### (最後に)
「最短時間で実動作させ、欲しい情報が取得できる」を目標に作成してみましたがいかがでしょうか。今回の記事がお役に立てれば幸いです。