MacroCat@Siro - ExcelVBA・PHP・フリーランス

ExcelVBA、WEBスクレイピング、その他技術に関して書いていきます。

IE操作メモ③ - Amazonから検索結果一覧取得!

読者になる/フォローする

IE操作時の開発メモ

f:id:sirosiro346:20171005220852j:plain

コチラの記事は、ブログ管理人の開発メモです。
開発する際や、再度WEBから検索する手間を省くため、ソース + 一言コメントで記事を書いています。

Amazonからのデータ一覧取得方法

'
' 機能    :URL、開始ページ、終了ページを引数に、製品のリンク一覧を取得する
'
' 引数    :strURL          : カテゴリごとのもととなるURL
'               :intStartPage  :  開始ページ
'               :intEndPage    : 終了ページ
' 返り値   :
'
' 備考    :1 ~ 400ページ(最大表示ページ数)まで遷移してリストに格納
'
Function getSelectCategoryProductsListALL(strURL As String, intStartPage As Integer, intEndPage As Integer) As String()
On Error GoTo getSelectCategoryProductsListALL_Err
    
    Debug.Print "処理開始:" & Time
    
    '実行中を表示
    Range("B6").Value = "実行中です、しばらくお待ちください (1/5)"
    
    '******************IEを開く******************
    Dim objIE As InternetExplorer 'IEオブジェクトを準備
    Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
    objIE.Visible = False 'True:IEを表示 , False:IEを非表示
    
    '******************指定したページ数分(1 ~ 400)が最大URLデータ取得処理をループ******************
    Dim strlURL_1() As String 'URL格納用
    ReDim strlURL_1(0)
    Dim pageNo As Integer
    Dim listNo As Integer: listNo = 0 '配列の要素数更新用
    Dim el As IHTMLElement 'IHTMLエレメントオブジェクトを準備
    Dim URL_el As IHTMLElementCollection 'liのHTMLエレメントコレクションを準備
    Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
    
    For pageNo = intStartPage To intEndPage
    
        'ページ数をしてURLを開く
        objIE.navigate strURL & "&page=" & CStr(pageNo)
    
        'ページのデータを取得するために、ページが表示されるまで待つ
        Call SysContentCls.DisplayWait(objIE)
    
        'objIEで読み込まれているHTMLドキュメントをセット
        Set htmlDoc = objIE.document
        
        '商品タイトルのリンク要素を取得
        Set URL_el = htmlDoc.getElementsByClassName("a-link-normal s-access-detail-page  s-color-twister-title-link a-text-normal")
        
        'リンクの数分処理実行
        For Each el In URL_el
            
            If listNo = 0 Then
                
                strlURL_1(listNo) = el.href
            
            Else
                '要素数を更新
                ReDim Preserve strlURL_1(listNo) 'Preserveは今まで格納した値を残したままにするために記述
                
                strlURL_1(listNo) = el.href
                
            End If
            
            Debug.Print el.href
            
            '要素数を更新
            listNo = listNo + 1
            
        Next el
    
    Next pageNo
    
    'IEを閉じる
    objIE.Quit
    
    '戻り値にURLリストを入れる
    getSelectCategoryProductsListALL = strlURL_1
    
    Debug.Print "全てのリンク取得OK:" & Time
    Exit Function
    
getSelectCategoryProductsListALL_Err:
    MsgBox "エラー発生"

End Function


ページ数文のloop処理
開くURLに「&page=ページ数」を指定しています

        'ページ数をしてURLを開く
        objIE.navigate strURL & "&page=" & CStr(pageNo)

重要なところはココ!

        '商品タイトルのリンク要素を取得
        Set URL_el = htmlDoc.getElementsByClassName("a-link-normal s-access-detail-page  s-color-twister-title-link a-text-normal")

ソースの美しさはさておき、これで取得できます!

また、このクラス名はGoogleChromeで「Ctrl + Shift + I」を押して
デベロッパーツール」を開き、右上のエレメントを選択してHtmlを見れるボタンを押してから、取得したい項目を左側で選択すれば、
その要素のIDやらclass等が簡単に確認できます!
Excelでやる場合に限らず、WEBスクレイピングやるならこの確認方法は必須!!

エレメントを選択ボタン
f:id:sirosiro346:20171005221619p:plain


商品タイトル選択後のイメージ
f:id:sirosiro346:20171005221630p:plain

idで指定する場合、classで指定する場合、Tagで指定する場合それぞれ取得方法が違うため、
適宜変えていく必要がある!
IEから各要素(id , class , tag)を取得する方法は以下にまとめてます

siroexcelvba.hatenablog.com


ではではーノシ