VBAのIE(InternetExplorer)制御で「twpro」を利用してツイッターのアカウント、プロフィール情報を取得する制御方法について解説しています。
前回は、ツイッターのプロフィール検索の自動化まで説明しました。
今回は、データを抽出する方法について解説していきます。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
Sub sample()
Dim objIE As InternetExplorer
'twproで検索
Call ieView(objIE, "http://twpro.jp/")
Call formText(objIE, "word", "有吉")
Call tagClick(objIE, "input", "検索")
label01:
If tagCheck(objIE, "a", "もっと見る") = True Then
Call tagClick(objIE, "a", "もっと見る")
Sleep 2000
GoTo label01
End If
'アカウント名取得
r = 2
For Each objTag In objIE.document.getElementsByTagName("span")
If InStr(objTag.outerHTML, "screen-name") > 0 Then
Cells(r, 2) = Right(objTag.innerText, Len(objTag.innerText) - 2)
r = r + 1
End If
Next
'プロフィール情報取得
r = maxRC("アカウント情報", 2)
For i = 2 To r
Call ieNavi(objIE, "http://twpro.jp/" & Cells(i, 2))
For Each objTag In objIE.document.getElementsByTagName("div")
If InStr(objTag.outerHTML, "class=""description") > 0 Then
Cells(i, 3) = objTag.innerText
End If
Next
Next i
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
それでは、データ抽出処理について見ていきましょう。
'アカウント名取得
r = 2
For Each objTag In objIE.document.getElementsByTagName("span")
If InStr(objTag.outerHTML, "screen-name") > 0 Then
Cells(r, 2) = Right(objTag.innerText, Len(objTag.innerText) - 2)
r = r + 1
End If
Next
※ドラッグ(スワイプ)すると全体を確認できます。
まず、データを書き込む際の行をr=2で指定しています。
こちらは定数ではなく、データを書き込み毎に行番号が変わりますので変数で格納しています。
次に「getElementsByTagNameメソッド」を利用して、アカウント名を取得していきますが、その前にソースを確認してみましょう。
<div class="user">
<div class="face">
<img src="http://pbs.twimg.com/profile_images/489624026696802304/KnabLTvL_normal.jpeg" data-sn="ariyoshihiroiki">
</div>
<div class="main">
<div class="head">
<div class="menu">
<span class="badge">
<img src="/images/verified.png" width="16" height="16" alt="認証済みユーザです" title="認証済みユーザです">
</span>
<span class="actions empty" id="114446939">
<a class="follow" href="/home/follow/ariyoshihiroiki" target="_blank" rel="nofollow">フォローする</a>
</span>
</div>
<div class="meta">
<a href="/ariyoshihiroiki" target="_blank" name="ariyoshihiroiki">
<span class="name">有吉弘行</span>
<span class="screen-name"> @ariyoshihiroiki</span>
</a>
<span class="paren">[日本]</span>
<span>3292687人がフォロー</span>
</div>
</div>
<div class="body">穏やかに。。。</div>
</div>
<div class="clear"><!----></div>
</div>
※ドラッグ(スワイプ)すると全体を確認できます。
こちらは1つのアカウント情報のソースになりますが、見て分かるようにほとんどがdivタグでくくられています。
divタグは多く利用されるタグであるため抽出する際には非常にやっかいなタグです。
今回はアカウント名とプロフィール内容の抽出ですが、アカウント名については、spanタグに「screen-name」の一意のキーワード(1アカウント内)があるので簡単に抽出できそうですが、プロフィールはdivタグ内に「body」があるもののdivタグを基準にしてしまうと、どの時点で抽出させるかが非常に困難です。
ですので、この場合は検索ページから抽出せずにアカウント詳細ページで取得するようにしましょう。
アカウント詳細ページとは検索画面のアカウントをクリックすると「http://twpro.jp/ariyoshihiroiki」のように「http://twpro.jp/」+ariyoshihiroiki(アカウント名)になっているのが分かります。
ということは、アカウント名が取得できれば、簡単に詳細ページを表示させることが可能ですね。
ここでは、まずアカウント名だけを抽出しています。
For Each objTag In objIE.document.getElementsByTagName("span")
If InStr(objTag.outerHTML, "screen-name") > 0 Then
Cells(r, 2) = Right(objTag.innerText, Len(objTag.innerText) - 2)
r = r + 1
End If
Next
※ドラッグ(スワイプ)すると全体を確認できます。
まず「getElementsByTagNameメソッド」でspanを指定して全てのspan情報を抽出します。こちらを1つずつチェックしていきますが、spanタグに「screen-name」が含まれている場合は、アカウント情報が含まれていますのでCells(r, 2)にアカウント名を入力していきます。
Right(objTag.innerText, Len(objTag.innerText) - 2)
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはアカウント名を抽出している部分になりますが、objTag.innerTextだけで抽出した場合「 @ariyoshihiroiki」となり、前に半角スペースと@が含まれています。
r = r + 1
※ドラッグ(スワイプ)すると全体を確認できます。
こちらは、アカウント名が抽出できたら、次の行へ移動するためにr変数に1を加えています。
あとは、これらの処理を繰り返し全てのアカウント名を抽出したら完了となります。
ここまでがアカウント名の抽出になりますので、次はプロフィール情報の抽出を見ていきましょう。
'プロフィール情報取得
r = maxRC("アカウント情報", 2)
For i = 2 To r
Call ieNavi(objIE, "http://twpro.jp/" & Cells(i, 2))
For Each objTag In objIE.document.getElementsByTagName("div")
If InStr(objTag.outerHTML, "class=""description") > 0 Then
Cells(i, 3) = objTag.innerText
End If
Next
Next i
※ドラッグ(スワイプ)すると全体を確認できます。
まず、データの数を調べるために最終行を取得する「maxRC」を利用して、「アカウント情報」シートの2列目(アカウント列)の最終行を取得しています。
データ数が分かったら、全てのデータを処理していくので「For~Nextステートメント」で全データの処理をします。
次に指定したURLを表示する「ieNavi」で「http://twpro.jp/」にアカウント名(Cells(i, 2))を結合させ、アカウントの詳細ページを表示させます。
<div class='user-desc'>
<div class='description'>穏やかに。。。</div>
</div>
(省略)
$(function(){
try{
/*
* Decorate description
*/
$('.user .body').each(function(i, e){
$(e).html($.twpro.filterDesc($(e).text()));
});
※ドラッグ(スワイプ)すると全体を確認できます。
続いて実際に取得する処理ですが、「getElementsByTagNameメソッド」でdivを指定して全てのdiv情報を抽出します。
そして、divタグ内の一意のキーワードですが、最初に「description」で処理しようと思ったら、他のdivタグにも存在していたので、classまであわせて「class=""description」を一意のキーワードとしました。
あとは、全てのアカウントを処理したら終了となります。
マクロを見てお分かりかと思いますが、サブルーチンが非常に活躍していますね。
サブルーチンを利用すると時間短縮やソースも解読しやすくなりますので是非活用しましょう。
次の記事: VBAのIE操作でツイッターのツイート数・フォロー数・フォロワー数の自動取得 >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
↑VBAのIE操作で分からない事があればこちらの掲示板よりご質問ください。
ExcelのVBA初心者入門↑こちらはVBAをマスターできるよう初心者向けのエクセルVBA入門コンテンツになります。
こちらでは、エクセルVBAで実際に作成したIE(InternetExplorer)制御ツールをまとめています。自動ログインや情報収集など具体的に解説しています。IE(InternetExplorer)制御をされる方は参考にしてください。
こちらでは、これまでに紹介したIE(InternetExplorer)操作で便利な機能をツール化しています。無償でダウンロードできますので、目的に合わせたご利用ください。
こちらでは、IE(InternetExplorer)オブジェクトのメソッド・プロパティをまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたVBA関数をまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたステートメントをまとめています。ExcelのVBAで基本的な部分になりますので、しっかり理解しましょう。
こちらでは、これまでに作成したIE(InternetExplorer)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。