VBScriptでWEBスクレイピング!アメブロの投稿記事一覧をテキストファイルに書き出す方法


こんにちは!あつもり(@atumori17)です。

VBScriptでIEを操作してWEBスクレイピング!の第10回目で~す。
前回は「アメブロのブログ管理画面に自動ログインする」ところまでやりました。

VBScriptでWEBスクレイピング!アメブロの管理画面に自動でログインする方法
IEを使ってアメブロのログイン画面にアクセスし、ID、パスワードを入力して自動ログインしていく方法を説明していきます。For each文でコレクションとして取得したa要素ぶんだけ繰り返しinnerTextプロパティを使いa要素のテキスト内に「ログイン」という文字があるかを調べクリックさせます。

今回は「アメブロの投稿記事一覧をテキストファイルに書き出す」方法を紹介します。

アメブロのブログ管理画面に自動ログインして、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

プログラムコードの解説

全体の流れは以下のようになります。

  1. IEでアメブロのログイン画面を開く
  2. ログインボタンをクリックする
  3. ID、パスワードを入力する
  4. ログインボタンをクリックする
  5. 記事編集画面に移動する
  6. 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メソッドを使います。

HTMLドキュメント.getElementById(“ID名”)

今回の場合、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

ページの読み込み待ちの処理については過去の記事で掲載していますので参考にしてみてください、

VBScriptでWEBスクレイピング!ブラウザの読み込み待ちをしてエラーを回避する
IEのページ読み込み待ちしてHTMLドキュメントからWEBサイトのタイトル名を取得する方法をご紹介します。面倒なようですがWEBスクレイピングはIEがページ全体を読みむまで待ってあげてから、データを取得するという手順を踏まなければならないからです。

プログラムコードの解説は以上です。

アメブロ記事一覧を取得してみる

では実際にアプリケーションを起動してみます。デスクトップにある「アメブロ記事一覧取得.vbs」をダブルクリックします。

ログイン画面が表示されました。ここで自動でログインボタンがクリックされます。

ログインボタンがクリックされ、ID、パスワード入力画面に移りました。ここではID、パスワードが自動で入力され、その後にログインボタンがクリックされます。

管理画面が表示されます。ここまでは前記事の流れと同じです。続いて1月から12月までのページを順に読み込んでいきます。

タイトル一覧がテキストファイルに書き出されました。

「アメブロ記事タイトル一覧.txt」を開くと、年、月、タイトルが書き出されています。

まとめ

今回は「アメブロの投稿記事一覧をテキストファイルに書き出す方法」をお伝えしてきました。

今回の内容をまとめると以下のようになります。

  • getElementByIdメソッドを使うとId名で要素を取得できる
  • getElementsByTagNameメソッドでh2要素を書き出す
  • ページの読み込み待ち処理を独自関数にまとめプログラムコードの可読性を上げる

以上です。

全10回に渡って「VBScriptでWEBスクレイピング」をテーマにして連載してきました。いかがでしたでしょうか?WEBスクレイピングを上手く活用して業務効率化に役立てて頂ければ嬉しいですっ。

それではお疲れさまでした~。

連載目次:VBScriptでお手軽WEBスクレイピング

Windowsを操作できるプログラミング言語「VBScript」を使えば、InternetExplorerを操作してWEBスクレイピングが可能です。 これで日々の情報収集はダブルクリック一発で完了させましょう!
  1. VBScriptでInternet Explorerを使って複数WEBサイトをダブルクリック一発で開く方法
  2. VBScriptでWEBスクレイピング!ファイルシステムオブジェクトでテキストに書き出す
  3. VBScriptでWEBスクレイピング!HTMLドキュメントとタイトルを取得する方法
  4. VBScriptでWEBスクレイピング!ブラウザの読み込み待ちをしてエラーを回避する
  5. VBScriptでWEBスクレイピング!aタグのリンクURLを全部取得する方法
  6. VBScriptでWEBスクレイピング!aタグのリンクURLをHTMLとして書き出す
  7. VBScriptでWEBスクレイピング!hタグを取得してHTMLとして書き出す
  8. VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す
  9. VBScriptでWEBスクレイピング!アメブロの管理画面に自動でログインする方法
  10. VBScriptでWEBスクレイピング!アメブロの投稿記事一覧をテキストファイルに書き出す方法

タイトルとURLをコピーしました