Excel VBAでSeleniumBasicを使用してChromeを操作し、J-PlatPatから公報をダウンロードする方法

ここまで、Excel VBAを使ってインターネットエクスプローラ(IE)を制御することで、J-PlatPatから特許公報テキストをダウンロードすることができるようになった。ところが、どうやらマイクロソフトは IE を見限ったようで、今後は徐々にサポート対象外となるような話が出ている。VBAでインターネットにアクセスし、ウェブページを操作したり、データをダウンロードしようとしたら、現時点ではIEを使うのが手っ取り早い方法ということになるが、今後はそれがどうなるのか、今の時点では特にアナウンスはされていないようだ。

また、IE だと、Espacenet にアクセスしても一部の公報で表示がうまく行われないという現象も見られるようなので、何とかしたいと考えていたところでもあり、この際、IE以外のブラウザを操作して、インターネットからデータをダウンロードする方法として、SeleniumBasic を使用した Google Chrome の操作にチャレンジしてみた。

ここでは、IEを操作するマクロと比較しやすいように、ここまで説明してきた J-PlatPat からテキスト公報をダウンロードする操作と全く同じ動作をするマクロを、SeleniumBasic を使用して行うことにした。IEを操作するマクロの詳細については、「Excel VBAを使用してJ-PlatPatから公報テキストをダウンロードする方法」の(1)(2)(3)(4)(5)を参照いただきたい。

1.準備

Excel VBAでSeleniumBasicを使用してGoogle Chromeを操作するためには、SeleniumBasicのインストール、Chromeドライバーのインストール、Excel VBAへの参照設定といった事前作業が必要となる。これらの作業については、いくつかのサイトで丁寧に説明がなされているので、これらを参照願いたい(例えば、以下のサイト)。

 ・VBAのスクレイピングを簡単楽にしてくれるSelenium
 ・非エンジニアにこそ伝えたいSeleniumBasic
 ・Seleniumを使ってVBAからchromeブラウザ操作(VBA編)

2.J-PlatPatのトップページを開く

最初に、Chromeを立ち上げ、J-PlatPatのトップページを開く。既にChromeが立ち上がっている場合には、それとは別の新たなウィンドウで立ち上がる。なお、SeleniumBasicが立ち上げた新たなChromeのウィンドウの左上には「Chromeは 自動テスト ソフトウェアによって制御されています。」という表示が出る。

Dim Driver As New Selenium.WebDriver
Dim url As String

url = “https://www.j-platpat.inpit.go.jp/”

Driver.Start “chrome”
Driver.Get url

Do While InStr(Driver.PageSource, “>検索<“) = 0
      DoEvents
      Application.Wait [Now()] + 100 / 86400000
Loop

所定のURLのサイトを開くところまでは特に問題はない。SeleniumBasicの場合、ブラウザがビジーの間は処理が戻ってこないようなので、IE制御の場合にはお約束のように多用した objIE.readystate と objIE.Busy をチェックする Do While ループは必要ない。それでも、表示が完了したかどうかのチェックは必要なので、ここではHTML中に”>検索<“が含まれていることが確認できるまで待機している。なお、IE制御のときの objIE.document.body.innerHTML に該当するのが、SeleniumBasic では Driver.PageSource である。

3.公報番号を入力し、検索ボタンをクリックし、検索結果一覧の表示完了を確認する

Dim patnum As String
Dim i As Integer
patnum = “特開2018-010101”

Driver.FindElementById(“s01_srchCondtn_txtSimpleSearch”).Clear
Driver.FindElementById(“s01_srchCondtn_txtSimpleSearch”).SendKeys patnum
Driver.FindElementByName(“s01_srchBtn_btnSearch”).Click

i = 1
Do While InStr(Driver.PageSource, “特願”) = 0 And i < 300
      DoEvents
      i = i + 1
      Application.Wait [Now()] + 100 / 86400000
Loop

前半部分では、テキストボックス”s01_srchCondtn_txtSimpleSearch”に公報番号を入力し、検索ボタン”s01_srchBtn_btnSearch”をクリックしている。IE制御の際には、何やらややこしい操作が必要だったのだが、SeleniumBasicでは教科書通りに SendKeys でテキストを送信し、ボタンをクリックすることで問題なく検索される。ただし、テキストボックス内に既にテキストが入っている場合には、それに追加されてしまうので、事前にクリアしてからテキストを送信するようにしている。

後半部分では、検索結果一覧表が表示されたことを確認するため、”特願”という語句が検出されるか、または繰り返し回数が300回となるまで、ループさせている。

4.検索結果一覧にて公報のリンクをクリックし、文献表示画面を取り込む

Dim wEle As WebElement
Dim flag As Integer

flag = 0
i = 1
Do While flag = 0 AND i < 300
      For Each wEle In Driver.FindElementsByTag(“a”)
            If InStr(wEle.Text, patnum) > 0 Then
                  wEle.Click
                  flag = 1
                  Exit For
            End If
      Next
      Application.Wait [Now()] + 100 / 86400000
      i = i + 1
Loop

Set wEle = Nothing

ここでは、Driverの中に含まれるすべてのAタグの中から、所望の公報番号をテキストとして持っているAタグを見つけ、これをクリックする。この部分では使っている関数名が微妙に異なっているが、IE制御のときとほとんど変わりがない。クリック操作により、特許・実用新案文献表示画面が別ウィンドウで表示される。

このままでは、オブジェクト変数Driverには、まだ最初のウィンドウが入ったままであり、新たに開いたウィンドウの操作ができないので、切り換える。IE操作の際には、ここで立ち上がっている全てのウィンドウの中から所望のウィンドウを探し出し、そのウィンドウをオブジェクト変数に取り込む必要があったが、SeleniumBasicでは、次の1行で済む。

Driver.SwitchToNextWindow

これで新たに開いたウィンドウが、変数Driver に取り込まれるのだが、この後このウィンドウを閉じて、元のウィンドウを操作したりする際に、今どのウィンドウを操作しているのかわかりにくいので、次のように明示的にウィンドウを取り込む方法の方が良いかもしれない。

Dim targetTitle As String

targetTitle = “特許・実用新案文献表示|J-PlatPat [JPP]”
Driver.SwitchToWindowByTitle (targetTitle)

5.「要約」、「請求の範囲」、「詳細な説明」を開く

i = 1
Do While InStr(Driver.PageSource, “図面”) = 0 And i < 300
      DoEvents
      i = i + 1
      Application.Wait [Now()] + 100 / 86400000
Loop

For Each wEle In Driver.FindElementsByTag(“a”)
      If InStr(wEle.Text, “要約”) > 0 And InStr(wEle.Text, “開く”) > 0 Then
            wEle.Click
            i = 1
            Do While InStr(wEle.Text, “開く”) > 0 And i < 300
                  DoEvents
                  Application.Wait [Now()] + 100 / 86400000
                  i = i + 1
            Loop
            Exit For
      End If
Next

Set wEle = Nothing

最初に、文献表示画面にて、”図面” という語句が表示されたのが確認されるまで、待機し、その後、折り畳まれていた 「要約」 のリンクをクリックして内容を表示させている。要約の内容が表示されると、「要約」のリンクの右側の「開く +」が「閉じる -」に変わるので、「開く」が消えたことが確認されるまで待機している。

2021/02/03 ここの部分、J-PlatPat側の仕様変更に伴い、修正。
 文献表示画面にて、最初から「要約」が開いた状態で表示されるように変更になったので、「要約」のリンクを見つけ、その横に「開く +」の表示がある場合には「要約」のリンクをクリックするが、「開く +」の表示がない(既に開いている)場合には、その操作をスキップするように変更した。

その後、「請求の範囲」と「詳細な説明」に対しても、「要約」に対して行ったのと同様の処理を行う。これによって、必要な情報が全て表示された状態となっているはずである。

6.固定URLを表示させ、表示内容をダウンロード

For Each wEle In Driver.FindElementsByTag(“a”)
      If InStr(wEle.Text, “URL”) > 0 Then
            wEle.Click
            Exit For
      End If
Next

Set wEle = Nothing

Dim Fname As String
Fname = “D:\” & patnum & “.txt”

Open Fname For Output As #1
      Print #1, Driver.PageSource
Close #1

targetTitle = “簡易検索|J-PlatPat [JPP]”
Driver.Close
Driver.SwitchToWindowByTitle (targetTitle)

前半では、全てのAタグの中から、URLボタンを探し、これをクリックして固定URLを表示させている。ここまでの操作により、オブジェクト変数 Driver に必要な情報がすべて取り込まれたので、Driver.PageSource をテキストファイルに書き込んでいる。さらにこのウィンドウをクローズしたのち、SwitchToWindowByTitleで、検索結果一覧表が表示されている最初のウィンドウに操作を移す。これで、上の「4.」に戻って、次の公報のリンクをクリックして詳細画面を開くといった一連の操作を継続することが可能となる。

2 thoughts on “Excel VBAでSeleniumBasicを使用してChromeを操作し、J-PlatPatから公報をダウンロードする方法

  1. 2021年2月から文献表示画面において、最初から「要約」が開いた状態で表示されるようにJ-PlatPat側の仕様変更があったようなので、それに対応して、コードを少し修正した。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です