自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

【ExcelVBAでスクレイピング入門】Googleで検索順位を自動取得してみる① ~IEを開く、待つ、閉じるまで~

スクレイピングとは?

ウェブスクレイピング。ウェブサイトのHTMLから欲しい情報を指定して取得すること。

簡単に言うと手作業でウェブサイトからExcelにデータをコピペコピペコピペ・・・という地獄の作業を自動化してしまおうというものです。最近流行りの業務の自動化という考え方 RPA(Robotic Process Automation)にも通ずる というかRPAツール使わなくてもVBAでRPAできるってこと。

そもそもプログラム勉強するの嫌だけど仕事は自動化したいという人のために作られたのがRPAツールなので、プログラム勉強するモチベーションがある人は、是非とも仕事を自動化するプログラムを作ることに全力を注いでほしいです。(ただし、自分以外の仕事を自動化するという場合はメンテナンスが問題になるのでそこはご注意ください

 

さて、本連載ではmarumoの得意分野をさらに磨くべく、ExcelVBAでここまでできるんだぞと布教するべく、検索順位チェックツールのようなものを作っていきます。今回はデータ取得が主ですが、リンクをクリックするメソッドなどもあるのでWEBベースのシステムを使った業務であれば応用次第で割と簡単に業務自動化を実現できるかもしれませんね。

API使えや・・・という意見もあるかと思いますが、やっぱりブラウザ経由のスクレイピングは汎用性が高くて便利。あとJSONのパースとかしなくていい。APIキー取得しなくていい。APIで提供されていない項目も取得できる。 などの理由もあり今回はわかりやすい題材として検索順位を取得対象にしています。

APIでのデータ取得もそのうちやりたいな。楽天市場の検索APIとかね。

この連載記事でできるようになること
  • 指定したキーワードでGoogleの検索順位を一括取得
  • 次のページへのリンクをクリックしてページ移動しながら取得
  • スクレイピングに便利なCSSセレクタを知る
  • Seleniumの使いどころを知る

 

もしかしたら、おまけでやるかもしれないやーつ
  • 指定文字列を含むリンクタグを取得するFunction
  • JavaScriptを実行させる方法
  • 要素取得のリトライ処理(Seleniumみたいな使い勝手にしたい)

 

設計~Google検索するまで

第一回目では「Googleで検索する」ところまでをやっていきたいと思います。

一気に記事書くと説明が雑になりそう、後半力尽きて雑になりそう、飽きてきて雑になりそうなどの理由です。楽しくなってくるのは第二回目でシートに情報を書き込んで行くところからかなーと思います。

 

やりたいことと処理の流れをイメージ

やりたいこと・・・複数のキーワードごとの検索結果を取得

キーワード・・・良いの思いつかなかったのでこのブログのカテゴリ(21キーワード)で

  • CSS
  • EC
  • Excel
  • GAS
  • HTML
  • IoT
  • JavaScript
  • Python
  • Raspberry Pi
  • SCSS
  • Sass
  • VBA
  • bat
  • jQuery
  • selenium
  • お知らせ
  • ツール
  • マーケティング
  • 正規表現
  • 読書
  • 雑記

 

処理フロー概要

ざっくり処理内容と流れを考えます

  1. Internet Explorerを開く
  2. Googleでキーワードを検索
  3. キーワードごとにランクを付けながら「ページ名」「URL」「ディスクリプション」を取得
  4. 取得した情報をExcelのシートに記録していく
  5. 一番最後まで取得したら次のページに移動
  6. 3~4を繰り返す
  7. 2に戻る
  8. Internet Explorerを終了する

 

VBAで書いていくよ

ここまで口で言うのは簡単ですね。これを少しずつプログラムに落とし込んでいきます。

なるべく、なるべく丁寧にいきますよ。

 

VBE(VBAを書くやつ)を起動してModule1を作成

Excelを起動 →「Alt + F1」でVBEを起動

f:id:maru0014:20190518000123p:plain
VBE(Visual Basic Editor)を開く

Book1を右クリック → 挿入 → 標準モジュール

f:id:maru0014:20190518000442p:plain
標準モジュール新規作成

新規作成されたModule1をダブルクリックで開く

f:id:maru0014:20190518000633p:plain
Module1にプログラムを書きます

ブックをxlsm形式で保存

うっかりxlsx形式で保存してしまうと書き込んだプログラムが消えるのでご注意ください。

f:id:maru0014:20190518012315p:plain
Excel マクロ有効ブック(*.xlsm)で保存

 

前準備(参照設定)

VBAからInternet Explorerを操作するために必要な準備です。

ツール → 参照設定 を開く

f:id:maru0014:20190518000852p:plain
参照設定を開く

表示された一覧の中からMicrosoft Internet Controlsを探してチェックを入れる → OK

f:id:maru0014:20190518001039p:plain
「M」キーを押すとMで始まるライブラリ名まで移動できます

これでInternet Explorerを操作する準備ができました。

 

Internet ExplorerでGoogleを開く

以下のプログラムをコピペして実行してみてください。

「F5」キーもしくは再生ボタンを押すことで実行可能です。

無事に開いたでしょうか。

Sub web_scraping()

    Dim oIE As InternetExplorer 'oIEという変数はInternet Explorerが入ると宣言
    Set oIE = New InternetExplorer 'oIEに新しいIEを起動して定義
    
    oIE.Visible = True 'IEを表示させる
    oIE.Navigate2 "https://www.google.co.jp/" 'URLにアクセス

End Sub

f:id:maru0014:20190518002215g:plain
IEでGoogleを開く

ちなみにSet oIE = CreateObject("InternetExplorer.Application")のように書くなら参照設定不要になりますが、インテリセンス(自動補完)が効かなくなります。

 

Internet Explorerを閉じる

先程のプログラムではInternet Explorerが開きっぱなしになっていますので、きちんと閉じる処理を追加しておきます。

Sub web_scraping()

    Dim oIE As InternetExplorer 'oIEという変数はInternet Explorerが入ると宣言
    Set oIE = New InternetExplorer 'oIEに新しいIEを起動して定義
    
    oIE.Visible = True 'IEを表示させる
    oIE.Navigate2 "https://www.google.co.jp/" 'URLにアクセス
    
    oIE.Quit 'IEを閉じる
    
End Sub

一瞬開いて閉じるはず。これじゃあ確認できないですよね。

f:id:maru0014:20190518010011g:plain
Googleが表示される間もなく閉じられる

 

「待つ」処理を追加する

今後スクレイピングにおいて「待つ」という処理が都度発生します。

方法は2つありますが調べて見たところどっちを使っても大差ないようなのでお好きな方でどうぞ。

【VBA入門】Sleep関数(API)やWaitメソッドで処理を止める方法 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

 

sleepメソッドで3秒待つ

「指定した秒数(ミリ秒)だけ待機する」という処理

個人的には見た目がシンプルなSleepの方が好み。何度も待機が発生するならこっちがいいかな。

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub web_scraping()

    Dim oIE As InternetExplorer 'oIEという変数はInternet Explorerが入ると宣言
    Set oIE = New InternetExplorer 'oIEに新しいIEを起動して定義
    
    oIE.Visible = True 'IEを表示させる
    oIE.Navigate2 "https://www.google.co.jp/" 'URLにアクセス
    
    slepp 3000 '3秒待機
    
    oIE.Quit 'IEを閉じる
    
End Sub

 

Waitメソッドで3秒待つ

こっちは「指定した時間になるまで待機する」という処理。

ライブラリを読み込む記述が無い分、”むずかしそう”という拒否反応が出にくいのがメリットかな?

Sub web_scraping()

    Dim oIE As InternetExplorer 'oIEという変数はInternet Explorerが入ると宣言
    Set oIE = New InternetExplorer 'oIEに新しいIEを起動して定義
    
    oIE.Visible = True 'IEを表示させる
    oIE.Navigate2 "https://www.google.co.jp/" 'URLにアクセス
    
    Application.Wait Now() + TimeValue("00:00:03") '3秒待機
    
    oIE.Quit 'IEを閉じる
    
End Sub

これらの待機処理を加えてから実行してみると、IEでGoogleを表示→3秒待つ→IEを閉じる

という動きをするはず。

f:id:maru0014:20190518004717g:plain
IEでGoogleを開いて3秒待ったあと閉じる

 

まとめ

第一回はここまで。

開いて閉じる というだけでしたが、キャプチャ画像もいれつつやるとまぁまぁなボリュームになりますね。

あと今回の記事では初めてGIF画像を取り入れてみました。Screenpressoというソフトで撮ってます。超便利。ただ最後のロゴが主張強い。

第二回は「Googleでキーワードを検索して結果を取得」までを行います。 ページャーに手を付けるのは三回目からかな。

code-life.hatenablog.com