【VBA】楽天ランキングページをWebスクレイピング④

VBAで実践するWeb操作VBA

VBAで楽天ランキングページをWebスクレイピングする方法について、最後に補足説明を行います。

前回記事はこちら

コードのおさらい

前回まで使用していたコードは以下のようなものでした。

Option Explicit


Sub getElm()
    
    '■1.前処理
    'IEのオブジェクトを作成
    Dim ie As InternetExplorer
    Set ie = New InternetExplorer
    
    'IEが開かないように設定
    ie.Visible = False


    '■2.本処理
    '指定のURLを開く
    ie.Navigate ("https://ranking.rakuten.co.jp/weekly/")
        
    'ページの読み込みが完了するまで待つ
    Do While ie.readyState <> READYSTATE_COMPLETE
        'OSに制御を戻す
        DoEvents
    Loop
             
    
    Dim products As Object
    Dim product As Object
    Dim name As String
    Dim price As String
    Dim url As String
    Dim rank As Integer
    rank = 1
    
    Set products = ie.Document.getElementsByClassName("rnkRanking_top3box")
    For Each product In products
        
        name = product.getElementsByClassName("rnkRanking_itemName")(0).innerText
        price = product.getElementsByClassName("rnkRanking_price")(0).innerText
        url = product.getElementsByClassName("rnkRanking_itemName")(0).getElementsByTagName("a")(0).href
        Debug.Print "■第" & rank & "位"
        Debug.Print "商品名:" & name
        Debug.Print "価格:" & price
        Debug.Print "URL:" & url
        rank = rank + 1
    
    Next product
      
      
    '■3.後処理
    ie.Quit
    Set ie = Nothing
            
End Sub

4位以下を取得したい場合

今回は、1位~3位を取得する前提であったため、「rnkRanking_top3box」というクラス名で要素を取得しました。

    Set products = ie.Document.getElementsByClassName("rnkRanking_top3box")

4位以下を取得したい場合は、4位以下の商品が含まれる要素を指定すれば良いです。Google開発者ツールで確認してみてください。

楽天へのアクセス回数が多くならないか?

ランキングページには、1位~80位までの80件の商品が掲載されています。
前述の方法(4位以下を取得する)を使うことで、一度に80件の商品情報をWebスクレイピングによって取得することが可能です。

そんな中で、「1回に80アクセスもしたら楽天からペナルティを受けるのではないか?」と懸念される方、いるのではないでしょうか?

結論から言うと、問題はありません。
その理由について説明します。

サーバーへのアクセス回数

このような懸念をされる方は、「サーバーに80回アクセスする」と考えているのだと思いますが、実際は、「サーバーへのアクセス回数は1回」です。

サーバーへのアクセスタイミング

では、サーバーへのアクセスがどのタイミングで行われるのか、ソースコードで確認してみましょう。

「サーバーに80回アクセスする」と考えている方は、以下のところでサーバーにアクセスしているという認識なのだと思います。

    For Each product In products
        
        name = product.getElementsByClassName("rnkRanking_itemName")(0).innerText
        price = product.getElementsByClassName("rnkRanking_price")(0).innerText
        url = product.getElementsByClassName("rnkRanking_itemName")(0).getElementsByTagName("a")(0).href
        Debug.Print "■第" & rank & "位"
        Debug.Print "商品名:" & name
        Debug.Print "価格:" & price
        Debug.Print "URL:" & url
        rank = rank + 1
    
    Next product

実際は以下のところになりますので、サーバーへのアクセスは1回のみです。
上の処理は、「サーバーから取得済のデータ」を使って商品名や価格などを取得しているので、サーバーへのアクセスは行われません。

    '■2.本処理
    '指定のURLを開く
    ie.Navigate ("https://ranking.rakuten.co.jp/weekly/")
タナイ
タナイ

何度もアクセスするような無駄なプログラムにせず、1度のアクセスでより多くの情報を取れないか検討することが望ましいです。

コメント

タイトルとURLをコピーしました