こんにちは!あつもり(@atumori17)です。
VBScriptでIEを操作してWEBスクレイピング!の第10回目で~す。
前回は「アメブロのブログ管理画面に自動ログインする」ところまでやりました。
今回は「アメブロの投稿記事一覧をテキストファイルに書き出す」方法を紹介します。
アメブロのブログ管理画面に自動ログインして、1月から12月までの投稿記事のタイトル名をテキストファイルに書き出していきます。
全10回に渡ってVBScriptを使ったWEBスクレイピングのテクニックを紹介してきましたが、その集大成となる内容です。今までやってきたことのおさらい的な内容になっています。
アメブロの管理画面に自動ログインするスクリプト
ではまずスクリプトの全文を紹介します。テキストエディタを開き下記のコードを入力します。全て入力し終わったら「アメブロ記事一覧取得.vbs」のファイル名でデスクトップに保存します。
Option Explicit Dim objIE Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'IEを開く objIE.navigate "http://kuchikomi.ameba.jp/ucs/logininput" 'ページが読み込まれるまで待つ Call WaitReadIe Dim el 'a要素にログインがあったらクリックする For each el In objIE.document.Links if instr(el.innerText,"ログイン") then el.click exit for end if next Call WaitReadIe 'IDとパスワードを入力する With objIE.document .getElementsByName("accountId")(0).Value = "test@gmail.com" .getElementsByName("password")(0).Value = "1111" End With 'button要素をコレクションとして取得 Dim objbutton Set objbutton = objIE.document.getElementsByTagName("button") 'button要素にログインがあったらクリックする For each el In objbutton if instr(el.innerText,"ログイン") then el.click exit for end if next Call WaitReadIe 'a要素に記事の編集・削除があったらクリックする For each el In objIE.document.Links if instr(el.innerText,"記事の編集・削除") then el.click exit for end if next Call WaitReadIe '選択中のページの年をテキストファイルに出力する OutputText objIE.document.getElementById("entryYear").innertext Dim i Dim el2 '1月から12月まで順番にページを読み込む For i = 1 to 12 'a要素に月があったらリンク先のページを読み込む For each el In objIE.document.Links if instr(el.innertext,i & "月") then 'リンク先のページを読み込む objIE.navigate el Call WaitReadIe '選択中のページの月をテキストファイルに出力する OutputText i & "月" 'h2要素を取得してオブジェクト変数にセットする Dim objH2 Set objH2 = objIE.document.getElementsByTagName("h2") 'h2要素をテキストファイルに書き出す For each el2 In objH2 OutputText el2.innertext next exit for end if next next 'ページが読み込まれるまで待つ Function WaitReadIe Do While objIE.Busy = True Or objIE.readyState <> 4 WScript.Sleep 100 Loop End Function 'テキストファイルへ出力 Function OutputText(ByVal strMsg) Dim objFSO Dim objText 'ファイルシステムオブジェクト Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'テキストファイルを開く Set objText = objFSO.OpenTextFile("C:\work\アメブロ記事タイトル一覧.txt", 8, True) objText.write strMsg objText.write vbCrLf objText.close 'オブジェクト変数をクリア Set objFSO = Nothing Set objText = Nothing End Function
プログラムコードの解説
全体の流れは以下のようになります。
- IEでアメブロのログイン画面を開く
- ログインボタンをクリックする
- ID、パスワードを入力する
- ログインボタンをクリックする
- 記事編集画面に移動する
- 1月から12月までの各ページを読み込み、h2要素をテキストファイルに書き出す
1~4までは前回の記事で紹介していますので、5~6の流れを解説していきます。
a要素のコレクションから記事の編集削除を探しクリックする
まずはFor each文でコレクションとして取得したa要素ぶんだけ繰り返す処理を行います。続いてinnerTextプロパティでa要素をテキストとして取得し「記事の編集・削除」という文字があるかを調べます。
指定した文字が含まれているかを調べるにはinstr関数を使うんでしたね。文字が見つかったらclickメソッドを使ってリンクをクリックさせます。
ここまでは前回説明しましたログインをクリックする流れと同じですね。
上記プログラムコードの17~23行目になります。
'a要素に記事の編集・削除があったらクリックする For each el In objIE.document.Links if instr(el.innerText,"記事の編集・削除") then el.click exit for end if next
getElementByIdメソッドで年を取得する
記事の編集画面が表示されたところで、まずは画面の左上にある「2017年」を取得してテキストデータに書き出します。年を取得するにはどうしたらいいんでしょう?
まずはこのページのソースを表示させてみます。年を取得するにはidが「entryYear」の要素を取得すれば良さそうです。
特定のidの要素を取得するにはgetElementByIdIDメソッドを使います。
今回の場合、id名が「yearText」のテキストデータを取得したいので、次のようにします。上記プログラムコードの54~55行目になります。
'選択中のページの年をテキストファイルに出力する OutputText objIE.document.getElementById("entryYear").innertext
a要素から月を探し1月から12月まで順番にページを読み込む
続いて1月から12月まで順番にページを読み込みh2要素を取得していきます。
For文で1月から12月まで繰り返し、a要素にその月があったらページを読み込んでいます。
上記プログラムコードの59~66行目になります。
'1月から12月まで順番にクロールする For i = 1 to 12 'a要素に月があったらリンク先のページを読み込む For each el In objIE.document.Links if instr(el.innertext,i & "月") then 'リンク先のページを読み込む objIE.navigate el
getElementsByTagNameメソッドでh2要素を書き出す
1月から12月までページを順に読み込み、テキストファイルの書き出していきますが、どの月なのかが後でわからないと不便です。そこでまずは読み込んだ月をテキストファイルに書き出します。
上記プログラムコードの70~71行目になります。
'選択中のページの月をテキストファイルに出力する OutputText i & "月"
月をテキストファイルに書き出したら今度は記事のタイトル一覧を書き出していきます。
記事のタイトルはh2要素なので、getElementsByTagNameメソッドを使いタグ名で要素を取得します。
取得したh2要素のコレクションをFor each文で1つ1つの要素ごとにテキストファイルに書き出します。
h2要素のテキスト部分のみを抜き出したいのでinnertextメソッドを使っています。
これは過去の記事で何度もやっているおなじみの流れですね。上記プログラムコードの73~80行目になります。
'h2要素を取得してオブジェクト変数にセットする Dim objH2 Set objH2 = objIE.document.getElementsByTagName("h2") 'h2要素をテキストファイルに書き出す For each el2 In objH2 OutputText el2.innertext next
ページの読み込み待ち処理を独自関数にまとめる
最後に補足説明です。プログラムコードのあちこちでページの読み込み待ち処理をしていますが、この処理を独自関数にしてまとめています。上記プログラムコードの87~94行目になります。
独自関数にまとめることで、プログラムコードの可読性を上げるためです。
'ページが読み込まれるまで待つ Function WaitReadIe Do While objIE.Busy = True Or objIE.readyState <> 4 WScript.Sleep 100 Loop End Function
ページの読み込み待ちの処理については過去の記事で掲載していますので参考にしてみてください、
プログラムコードの解説は以上です。
アメブロ記事一覧を取得してみる
では実際にアプリケーションを起動してみます。デスクトップにある「アメブロ記事一覧取得.vbs」をダブルクリックします。
ログイン画面が表示されました。ここで自動でログインボタンがクリックされます。
ログインボタンがクリックされ、ID、パスワード入力画面に移りました。ここではID、パスワードが自動で入力され、その後にログインボタンがクリックされます。
管理画面が表示されます。ここまでは前記事の流れと同じです。続いて1月から12月までのページを順に読み込んでいきます。
タイトル一覧がテキストファイルに書き出されました。
「アメブロ記事タイトル一覧.txt」を開くと、年、月、タイトルが書き出されています。
まとめ
今回は「アメブロの投稿記事一覧をテキストファイルに書き出す方法」をお伝えしてきました。
今回の内容をまとめると以下のようになります。
- getElementByIdメソッドを使うとId名で要素を取得できる
- getElementsByTagNameメソッドでh2要素を書き出す
- ページの読み込み待ち処理を独自関数にまとめプログラムコードの可読性を上げる
以上です。
全10回に渡って「VBScriptでWEBスクレイピング」をテーマにして連載してきました。いかがでしたでしょうか?WEBスクレイピングを上手く活用して業務効率化に役立てて頂ければ嬉しいですっ。
それではお疲れさまでした~。
連載目次:VBScriptでお手軽WEBスクレイピング
Windowsを操作できるプログラミング言語「VBScript」を使えば、InternetExplorerを操作してWEBスクレイピングが可能です。 これで日々の情報収集はダブルクリック一発で完了させましょう!- VBScriptでInternet Explorerを使って複数WEBサイトをダブルクリック一発で開く方法
- VBScriptでWEBスクレイピング!ファイルシステムオブジェクトでテキストに書き出す
- VBScriptでWEBスクレイピング!HTMLドキュメントとタイトルを取得する方法
- VBScriptでWEBスクレイピング!ブラウザの読み込み待ちをしてエラーを回避する
- VBScriptでWEBスクレイピング!aタグのリンクURLを全部取得する方法
- VBScriptでWEBスクレイピング!aタグのリンクURLをHTMLとして書き出す
- VBScriptでWEBスクレイピング!hタグを取得してHTMLとして書き出す
- VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す
- VBScriptでWEBスクレイピング!アメブロの管理画面に自動でログインする方法
- VBScriptでWEBスクレイピング!アメブロの投稿記事一覧をテキストファイルに書き出す方法