スクレイピングを使って業務を効率化しよう(2)

どうやって自動で値を取得するのか?

スクレイピングの実践方法について

前回スクレイピングの導入方法(設定方法)について簡単な説明をさせていただきました。今回はWEBサイト上の値を実際に取得する方法について記載させていただきます。
なお、サンプルはVBAを使っています。VBAのほうが手軽に試せて新規にツールなどをインストールする必要がないため、やりたいことができるのか、できないのかなどを簡単に調査、サンプル作成ができ見定められるからです。
スクレイピングにはいろいろな使い道があります。あるキャリアのスマホの料金を毎日チェックしたいなど
ネット上の商品の価格をチェックしたいといったような場合には非常に適しているかと思います。

言葉は知ってますか。スクレイピングは、プログラムを利用してウェブページのHTML構造を解析し、特定の情報(例:商品価格、記事のタイトル、画像など)をプログラムで自動的に取得することを指します。最近人気のPythonというプログラム言語で利用している方が多いように思います。

下記の例は、tableの中に、商品名と価格が入った一覧表から商品名と価格を取得するサンプルです。


Sub GetTableDataWithSelenium()
    ' Selenium WebDriverを初期化
    Dim driver As New WebDriver
    Dim searchBox As WebElement
    
    ' Chromeブラウザを起動し、ウェブサイトにアクセス
    driver.Start "chrome", "https://example.com/products" ' ここに対象のURLを入力してください
    
    ' ページの読み込みが完了するまで待機
    driver.Wait 5000 ' ページが読み込まれるまで5秒間待機
    
    ' テーブルを取得する(例として最初のtableタグを取得)
    Dim table As WebElement
    Set table = driver.FindElementByTag("table")
    
    ' テーブル内の行を取得
    Dim rows As Object
    Set rows = table.FindElementsByTag("tr")
    
    Dim i As Long
    For i = 2 To rows.Count ' ヘッダーを除いた2行目以降を処理
        Dim cells As Object
        Set cells = rows(i).FindElementsByTag("td")
        
        ' 商品名と価格を取得(適宜列番号を調整してください)
        Dim productName As String
        Dim productPrice As String
        
        productName = cells(0).Text ' 商品名(1列目)
        productPrice = cells(1).Text ' 価格(2列目)

        ' 取得したデータをデバッグ表示
        Debug.Print "商品名: " & productName & ", 価格: " & productPrice
    Next i
    
    ' ブラウザを終了
    driver.Quit
End Sub


上記コードの流れです。

(1)Selenium WebDriverの初期化:
Dim driver As New WebDriver でSelenium WebDriverを初期化します。これにより、Chromeなどのブラウザを自動的に操作することができます。
ブラウザの起動とウェブサイトのナビゲート:

driver.Start "chrome", "https://example.com/products" を使って、Chromeブラウザを起動し、指定のURLにアクセスします。
driver.Wait 5000 でページが完全に読み込まれるのを待機します。この部分は必要に応じて調整してください。

(2)テーブルタグの取得:
Set table = driver.FindElementByTag("table") で、最初の<table>タグを取得します。この行を調整することで、特定のテーブルを選択することも可能です。
テーブルの行の取得:

Set rows = table.FindElementsByTag("tr") でテーブル内の全ての行(<tr>タグ)を取得します。

(3)テーブルのデータをループして取得:
For i = 2 To rows.Count で、ヘッダー行を除いた2行目からデータを取得します。
各行のセル(<td>タグ)を取得するために、Set cells = rows(i).FindElementsByTag("td") を使います。
productName = cells(0).Text と productPrice = cells(1).Text で、各セルのテキストを取得します。インデックス番号を必要に応じて調整してください。

(4)デバッグ表示:
Debug.Print を使って、取得した商品名と価格をVBAの「即時ウィンドウ」に表示しています。Excelのセルに出力する場合は、Cellsなどを使って書き込むことも可能です。

(5)ブラウザの終了:
最後に、driver.Quit でブラウザを閉じます。

いかがでしょうか。
思ったよりかなり簡単と思いませんか。
あとは取得したデータをデータベースに格納して履歴管理したり、価格によるソート機能をつけたりいろいろなことに利用できます。
アイデア次第でユーザーに有益な一覧を作ることが可能になります。

ぜひ一度ご確認ください。
次回は、seleniumを利用する上での注意事項について解説します。

おすすめの記事