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度のアクセスでより多くの情報を取れないか検討することが望ましいです。
コメント