VBAでスクレイピング タグをリスト化し検索文字列でセルに色付け
スクレイピングアプリを作るとき、例えばTDタグを一覧にして「次のページ」が何番目のタグに入っているか調べたい時があります。ということでVBAで任意のタグ一覧を抽出しリスト化その中で文字列検索しその文字が含まれていればセルに色を付けるマクロを作成しました。
以下の表をSheet1のA1にコピペしてください
| Tag | div | URL | https://www.yahoo.co.jp | 検索文字 | yahoo |
|---|
次のコードをマクロに記述してください
Option Explicit
'IE を 起動してタグを抽出する
Sub tagscraping()
Dim objIE As Object 'IEオブジェクト参照用
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
Dim URLst As String
Dim Tag As String
URLst = ThisWorkbook.Worksheets(1).Range("D1").Value
'.Navigate で 指定した文字列のURLを開く
objIE.Navigate URLst
Dim maxrow As Integer
'最下の行を取得 空白OK
With ActiveSheet.UsedRange
maxrow = .Rows(.Rows.Count).Row
'MaxCol = .Columns(.Columns.Count).Column
End With
If maxrow <> 1 Then
'行の削除
'MsgBox ("2:" & maxrow)
Range("2:" & maxrow).Clear
End If
'ページの表示完了を待ちます。
While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
DoEvents '重いので嫌いな人居るけど。
Wend
'.tags("TD") で TDタグを抜き出す
Dim objTD As Object 'テーブルオブジェクトの格納用
Tag = ThisWorkbook.Worksheets(1).Range("B1").Value
Select Case Tag
Case "td", "TD"
Set objTD = objIE.document.all.tags("TD")
Case "a", "A"
Set objTD = objIE.document.all.tags("A")
Case "img", "IMG"
Set objTD = objIE.document.all.tags("IMG")
Case "div", "DIV", "Div"
Set objTD = objIE.document.all.tags("DIV")
Case "Span", "span", "SPAN"
Set objTD = objIE.document.all.tags("SPAN")
Case "", "all"
Set objTD = objIE.document.all
End Select
ActiveSheet.Name = "タグを抜くテスト" 'シートに名前を付ける
'TDデータをシートに貼り付ける
Range("A2") = "変数n" '見出しをつける
Range("B2") = ".InnerHTML" '見出しをつける
Range("C2") = ".InnerTEXT" '見出しをつける
Range("D2") = ".OuterHTML" '見出しをつける
'いろいろなループを作れるけど、カウンタ n でまわしてみる
Dim n As Integer
For n = 0 To objTD.Length - 1 'カウンタ0から.length - 1 までまわす。
Cells(n + 3, "A") = n 'n+3行目にセット
Cells(n + 3, "B") = "'" & Left(objTD(n).InnerHTML, 500) 'デバック用に左から80文字までセット
Cells(n + 3, "C") = "'" & Left(objTD(n).InnerTEXT, 500) 'デバックなのでシングルコーテーションを付け
Cells(n + 3, "D") = "'" & Left(objTD(n).OuterHTML, 500) '文字列扱いでセットする
Next n
'後始末(使った食器はキレイにしてから戸棚に戻そうね)
Set objTD = Nothing
objIE.Quit '今回はコメントにして処理しない(残しておいた方がテスト時は楽です)
Set objIE = Nothing
'------検索文字のセルに色を付ける-----------
Dim MyBottom As Long
Dim c As Range
Dim firstAddress As String
Dim Myfindstr As String
'空白でないならセル色付けを呼ぶ
If Not (ThisWorkbook.Worksheets(1).Range("F1").Value = "") Then
Myfindstr = ThisWorkbook.Worksheets(1).Range("F1").Value
'最下の行を取得 空白OK
With ActiveSheet.UsedRange
maxrow = .Rows(.Rows.Count).Row
'maxCol = .Columns(.Columns.Count).Column
End With
With Range("B2:D" & maxrow)
Set c = .Find("*" & Myfindstr & "*", LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
With c.Interior
.ColorIndex = 6
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End If '空白でないならセル色付けを呼ぶのendif
End Sub
AB型の変わり者 三流プログラマー Ken3のHP様のコードをベースにさせて頂きました。
実行結果
サンプルではヤフーのページをTDタグで抜き出しリスト化、その中にyahooの文字列が入っているセルを黄色にします。
参考リンク Spcial thanks
AB型の変わり者 三流プログラマー Ken3のHP様 VBAでスクレイピングするならおすすめのページです。