Googleで検索して検索1位のサイトをダウンロードする。

弁理士関連で法律が年に1回変わるので学習ツールとか
作る際に、条文をダウンロードするのがなぁとおもっていたので
その元ネタでサンプル作成してみたよ。

Googleをキーワード検索して一番上にあるやつの
緑タイトルを拾ってそこにアクセスしてページソースをダウンロードする
というもの。エラー処理とかないので取扱いは慎重にした方が
いいですよ。

で以下、ソース。まさかCITEタグとは思いもしませんでした。
後はダウンロードした後にEXCELに加工して取り込めば楽できるな。
skeywordを他の法律に変えれば別の法律も取得できます。
法令検索の結果が一番に表示されるなら加工もしやすいかな・・・。


'//
'// 特許法のページソースを取得する
'//
'// Proxy環境の場合はDOSプロンプトで実行 netsh winhttp import proxy source=ie

Option Explicit

Dim sURI
Dim rgetHtml
Dim oFilename
Dim sKeyword

'// メイン部分
sKeyword = "特許法"
oFilename = "C:\temp\" + sKeyword +".txt"

sURI = getURL(sKeyword)

if sURI = False then
 MsgBox "notComplete"
end if

rgetHtml = getHTML(sURI,oFilename)
if rgetHtml=True then
 MsgBox "Complete"
end if

'// Googleでキーワード検索1位のURL(下に緑で出てる▼のやつ)を取得する
function getURL(sKeyword)
 Dim objIE
 getURL = False
 Dim rURL

 Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = False
 objIE.Navigate("https://www.google.co.jp/")
 waitIE objIE
 objIE.Document.getElementById("q").Value = sKeyword
    WScript.Sleep 100
 objIE.Document.all("btnG").Click
 waitIE objIE

 '// GoogleからURL取得
    rURL =objIE.document.getElementByID("ires") _
        .getElementsByTagName("li")(0) _
        .getElementsByTagName("cite")(0) _
        .innertext
 '// 有無を言わさず先頭にhttp://を付ける・・・
 getURL = "http://" + rURL

end function


'// URLを受取ってそのサイトの内容をtxt形式で保存する。
function getHTML(sURI,oFilename)
 Dim http
 Dim sHTML
 Dim ADODB
   
 '// 変数を初期化  
    getHTML = False
 Set http = CreateObject("WinHttp.WinHttpRequest.5.1")  
    Set ADODB = CreateObject("ADODB.Stream")
   
 '//ページソースを取得
 With http  
     .Open "GET", sURI, False         
     .Send  

  If .Status <> 200 Then  
         Err.Raise 5, , "HTML の取得に失敗"  
     Else  
 '//ファイルに書き込み
      With ADODB
          .Type = 1 'adTypeBinary
          .Open
          .Write http.responseBody
          .SaveToFile oFilename , 1 '1:adSaveCreateNotExist, 2:adSaveCreateOverWrite
          .Close
      End With
     End If  
 End With  

 getHTML = True
    Set http = Nothing
    Set ADODB = Nothing

End function


'// IEがビジー状態の間待ちます
Sub waitIE(ie)
    Do While ie.Busy = True Or ie.readystate <> 4
        WScript.Sleep 100
    Loop
    WScript.Sleep 1000
End Sub

コメント

Otazoman さんの投稿…
ふとしたことで触ってみると動かなかったので
調べてみると下記の通り修正して動いたよ。

38行目から下記の様に修正
objIE.Document.getElementById("lst-ib").Value = sKeyword
WScript.Sleep 100
objIE.Document.all("btnK").Click


44行目から下記の様に修正
rURL =objIE.document.getElementByID("ires") _
.getElementsByTagName("ol")(0) _
.getElementsByTagName("cite")(0) _
.innertext


IEに頼ってボタンを押すとかやるからこういう
やや濃いことになっているのだろうか・・・。
もっとDOM操作を勉強しないと。

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)