前回までに説明した内容をもとに、楽天のランキングページをWebスクレイピングしてみましょう。
前回記事はこちら
Contents
大まかな流れ
- 楽天ランキングページ(https://ranking.rakuten.co.jp/weekly/)にアクセスし、「ページ全体」を取得する。
- 「ページ全体」から、ランキングに掲載されている「商品」を1件ずつ取得する。
- 「商品」から、「値」(商品名、価格、URL)を取得する。
- 「値」を書きだす。
- 2~4を商品の数だけ繰り返す。
Webスクレイピングに必要な処理は毎回ほぼ同じ
こうして見ると、大まかな流れは前回の記事とほとんど変わらないことが分かります。
一度全体の流れが理解できれば、処理が異なる一部だけを対象ページ、データに合わせてアレンジすれば応用が可能です。
1.「ページ全体」を取得する
この部分は、前回と同じ方法が使えそうです。
2.「ページ全体」から、ランキングに掲載されている「商品」を1件ずつ取得する。
「商品」が取得したページのどの部分になるか、HTMLを見ながら検討が必要になりそうです。
3.「商品」から、「値」(商品名、価格、URL)を取得する。
2と同様、HTMLを見ながら検討が必要になりそうです。
4.「値」を書きだす。
取得した値を書きだします。
今回は「商品名」「価格」「商品詳細ページのURL」を対象とします。
5.2~4を商品の数だけ繰り返す
ランキングページには複数の商品が掲載されているので、商品の数だけ繰り返します。
今回のサンプルでは1位~3位の商品を出力します。
サンプルソース
実際のソースと実行結果は以下のようになります。
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
次回の予定
次回以降、手順に沿って具体的な説明に入ります。
コメント
書かれているコードを実行すると、2回に1回はフリーズしてしまいます。。
なぜでしょうか?
コメントありがとうございます!
IEにプラグインをたくさん入れてしまっているですとか、スタートページが大量にあるなど、
なんらかの要因でプログラムがIEを開く処理が重く、PC処理が詰まってしまっているかもしれません。
ie.Visible = Trueにしてieが正常に立ち上がっているかを確認してみてください。