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

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

【ExcelVBAでスクレイピング入門】Googleで検索順位を自動取得してみる④ ~2ページ目以降も取得する~

第三回では複数キーワードを順番に検索してExcelシートにキーワード、検索順位、ページタイトルを入力するところまでできました。

code-life.hatenablog.com

今回は検索結果一番下にある「次へ」を押していく機能です。 これが実装できれば1キーワード100位までとか取得できるようになりますね。

  • 前回までのおさらい
  • 2ページ目以降の取得に対応する
    • まず基準となる取得件数を変数に用意
    • data_inputプロシージャで取得した件数をカウントする
    • 受け側として引数を追加
      • For文の中にカウンターを記述
    • End Subの直前に条件文を記述
    • 次へ をクリックさせる
    • Call data_inputの引数に取得件数上限を追加
  • ディスクリプションが無い場合に対応する
    • 要素の有無を判別する
  • まとめ

一回目と二回目

code-life.hatenablog.com

code-life.hatenablog.com

続きを読む

【ExcelVBAでスクレイピング入門】Googleで検索順位を自動取得してみる③ ~複数キーワードの検索とデータ取得~

第二回では1キーワードを検索してExcelシートにキーワード、検索順位、ページタイトルを入力するところまでできました。

code-life.hatenablog.com

code-life.hatenablog.com

今回やっていくのは以下の内容。ここまでできれば検索結果のスクレイピングとしては十分な機能かな。

  • リンクURL、ディスクリプション
  • 複数のキーワードを検索
  • 2ページ目や3ページ目の結果も取得
続きを読む

【VBA】querySelectorAllで取得した要素に対してForEachを使うと謎のエラーが発生する

この記事でできるようになること

  • querySelectorAllで取得したコレクションに対してループ処理

ExcelVBAでWebページから情報を自動収集(スクレイピング)する時に超便利なメソッド querySelectorquerySelectorAll

CSSセレクタがそのまま使えて超便利だが、何故かquerySelectorAllに対してFor Eachを使ってループ処理を行うと処理を終えるタイミングで謎のエラーが発生して切断される事象に頭を悩ませていました。

f:id:maru0014:20190517222059p:plain
このWebページに問題があるため、Internet Explorerのタブを開き直しました

会社の人に相談しながらどうにか回避策を見つけたので共有したい。

続きを読む

【ExcelVBAでスクレイピング入門】Googleで検索順位を自動取得してみる② ~キーワードを検索して結果をシートに書き込む~

第一回ではGoogleを表示するところまででしたが、今回はスクレイピングの肝となるデータを抜き出す部分です。

もうちょっと間空けて投稿しようかと思ったけど勢いで公開。ここらへんまでやらないと面白くないもんね。

code-life.hatenablog.com

  • 前回までのおさらい
  • キーワードを検索する
    • プログラムにキーワード検索する部分を追加する
  • 検索結果から情報を取得する
    • Googleの検索結果から情報を取得するには
  • 取得した情報をMsgBoxで表示するよう書き加える
  • 要素を探す前にページの読み込みを待たないとエラーになる 
  • Excelのシートに連続で入力していく
    • 処理の流れを確認
    • 16-17行目 querySelectorAll
    • 23-25行目 For~Next文
    • 19-21行目 シートの記入開始行番号
    • 27-34行目 シートへの記入
  • まとめ

前回までのおさらい

前回のプログラムの処理フローを再確認します。

  1. IEを準備する
  2. IEを表示する
  3. Googleを開く
  4. 3秒まつ
  5. IEを閉じる

これらの動きをVBAで書いたものが以下のプログラムです。

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

これに「Googleでキーワードを検索する」「検索結果が表示されるのを待つ」「検索結果から情報を取得」「取得した情報をシートに書き込む」という処理を加えていきます。

続きを読む

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

スクレイピングとは?

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

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

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

 

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

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

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

  • スクレイピングとは?
    • この連載記事でできるようになること
    • もしかしたら、おまけでやるかもしれないやーつ
  • 設計~Google検索するまで
    • やりたいことと処理の流れをイメージ
      • 処理フロー概要
    • VBAで書いていくよ
      • VBE(VBAを書くやつ)を起動してModule1を作成
      • ブックをxlsm形式で保存
      • 前準備(参照設定)
      • Internet ExplorerでGoogleを開く
      • Internet Explorerを閉じる
      • 「待つ」処理を追加する
        • sleepメソッドで3秒待つ
        • Waitメソッドで3秒待つ
    • まとめ
この連載記事でできるようになること
  • 指定したキーワードでGoogleの検索順位を一括取得
  • 次のページへのリンクをクリックしてページ移動しながら取得
  • スクレイピングに便利なCSSセレクタを知る
  • Seleniumの使いどころを知る

 

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

 

設計~Google検索するまで

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

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

 

続きを読む