ツイッターのアカウント名・プロフィール情報を抽出
前回は、ツイッターのプロフィール検索の自動化まで説明しました。
今回は、データを抽出する方法について解説していきます。
ツイッターのアカウント名・プロフィール情報抽出のマクロ
#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」となり、前に半角スペースと@が含まれています。こちらのアカウント名は後の詳細ページを表示させるために利用しますので、前の2つは邪魔となるため削除しています。
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部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。