概要
アメブロの記事バックアップシリーズ、第6回となる今回は、特に「記事本文」の抽出に焦点を当て、その難しさと堅牢な取得方法について深く掘り下げていきます。これまで、VBAによるWebスクレイピングの基本的な概念、HTTPリクエストの送信、HTMLドキュメントの取得といった基礎技術については触れてきました。しかし、ウェブサイトのHTML構造は常に変化し、特にアメブロのようなプラットフォームでは、記事本文の間に広告や関連コンテンツ、SNSシェアボタンといった「ノイズ」が挿入されがちです。これらのノイズを適切に除去し、純粋な記事本文のみを、より確実に、そしてきれいに抽出する技術は、データ活用において極めて重要となります。
本稿では、複雑なHTML構造を持つアメブロの記事ページから、目的の本文コンテンツを正確に特定し、不要な要素をDOM(Document Object Model)から直接削除する実践的なテクニックを解説します。これにより、取得したデータがクリーンで、分析や再利用に適した形になることを目指します。VBAのDOM操作能力を最大限に引き出し、ウェブスクレイピングの精度を一段と高めるための秘訣を、具体的なコードと共にご紹介いたします。
詳細解説
アメブロのHTML構造の特性とDOMツリーの探索
アメブロの記事ページは、見た目の美しさや機能性を追求するため、非常に複雑なHTML構造を持つことが一般的です。記事本文は、通常、`
これらの要素を適切に区別し、純粋な本文を抽出するためには、HTMLドキュメントをDOMツリーとして捉え、その階層構造を正確に探索する能力が不可欠です。VBAでは、`InternetExplorer.Application`オブジェクトを通じて取得した`HTMLDocument`オブジェクトを利用し、`getElementById`, `getElementsByClassName`, `getElementsByTagName`といったメソッドを駆使して特定の要素にアクセスします。
さらに、これらの基本的なメソッドだけでは不十分な場合、`ChildNodes`, `ParentNode`, `NextSibling`, `PreviousSibling`といったプロパティを活用し、DOMツリーを上下左右に移動しながら、目的の要素を特定していく必要があります。特に、クラス名やIDが動的に生成されたり、他の要素と共通していたりする場合、単一のセレクタに依存するのではなく、親要素から子要素へとたどっていく「パス」を考慮した探索が求められます。
ターゲット要素の特定戦略
記事本文のコンテナを特定する最初のステップは、ブラウザの開発者ツール(F12キーで起動)を使って、対象記事のHTML構造を詳細に分析することです。多くの場合、記事本文は`
例えば、以下のようなHTML構造を想定してみましょう。
これは記事の最初の段落です。
記事の中間の段落です。
最後の段落です。
この場合、`class=”article-body”`を持つ`
`タグのような本文要素と、`ad-area`や`sns-share-buttons`のような不要な要素を区別する必要があります。
不要要素の除去とテキスト抽出の精度向上
ターゲットとなるコンテナ要素を特定したら、次にその内部から不要な要素を削除するプロセスに入ります。VBAの`HTMLElement`オブジェクトには`removeChild`メソッドがあり、これを利用することでDOMツリーから特定の要素を物理的に削除することができます。
具体的には、記事本文のコンテナ要素の`ChildNodes`コレクションをループし、`className`や`tagName`プロパティをチェックして、広告やSNSボタンなどのノイズ要素を識別します。識別されたノイズ要素は`removeChild`メソッドで削除します。この操作により、コンテナ要素の`innerHTML`や`innerText`プロパティは、純粋な記事本文のみを反映した状態になります。
テキスト抽出の際には、`innerText`と`textContent`のどちらを使用するかを検討します。`innerText`はブラウザに表示されるテキストを模倣し、CSSによる非表示要素を無視する傾向がありますが、`textContent`はすべてのテキストノードを含みます。一般的には、表示されている記事本文を得たい場合は`innerText`が適していますが、正確なテキストコンテンツが必要な場合は`textContent`も考慮に入れるべきです。また、抽出されたテキストには余分な改行や空白が含まれることがあるため、`Replace`関数や`Trim`関数を使った整形処理も重要です。
堅牢性の確保とIEオブジェクトの活用
ウェブサイトのHTML構造は予告なく変更される可能性があります。そのため、単一のセレクタに依存するコードは脆弱になりがちです。堅牢性を高めるためには、複数の候補となるクラス名やIDを試したり、XPathのようなより強力なセレクタを利用したりするアプローチが有効です。
アメブロのようにJavaScriptが多用され、動的にコンテンツが生成されるページでは、`MSXML2.XMLHTTP`のようなHTTPリクエストベースのアプローチでは、JavaScriptが実行されずに取得できる情報が限定的になる場合があります。このような場合、`InternetExplorer.Application`オブジェクトを使用することが非常に有効です。IEオブジェクトは実際のブラウザエンジンを利用するため、JavaScriptが実行され、完全にレンダリングされたDOMにアクセスすることができます。これにより、動的にロードされる記事本文や、JavaScriptによって生成される要素も正確に取得することが可能になります。
ただし、IEオブジェクトは処理速度が遅く、バックグラウンドでの動作が難しいという欠点もあります。そのため、用途に応じて適切なアプローチを選択することが重要です。今回は、より確実に記事本文を取得するためにIEオブジェクトを前提とした解説を進めます。
サンプルコード
以下に、アメブロの特定の記事から純粋な本文を抽出するVBAコードの例を示します。このコードは、IEオブジェクトを使用してページをロードし、記事本文のコンテナを特定した後、不要な要素を削除して、最終的な本文をExcelシートに書き出します。
**【事前準備】**
VBAエディタで「ツール」->「参照設定」を開き、以下のライブラリにチェックを入れてください。
* `Microsoft Internet Controls`
* `Microsoft HTML Object Library`
Option Explicit
Sub AmebloArticleBodyBackup()
Dim ie As Object ‘ InternetExplorer.Application
Dim htmlDoc As Object ‘ HTMLDocument
Dim articleBodyElement As Object ‘ 記事本文のコンテナ要素
Dim unwantedElements As Object ‘ 不要な要素のコレクション
Dim element As Object ‘ ループ用要素
Dim url As String
Dim ws As Worksheet
Dim rowNum As Long
Dim articleText As String
Dim i As Long
‘ ▼設定▼
url = “https://ameblo.jp/your-blog-id/entry-1234567890.html” ‘ バックアップしたいアメブロ記事のURLに置き換えてください
Set ws = ThisWorkbook.Sheets(“Sheet1”) ‘ 出力先のシート名に置き換えてください
rowNum = 1 ‘ 書き出し開始行
‘ 画面更新停止とイベント無効化で処理を高速化
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual ‘ 自動計算停止
On Error GoTo ErrorHandler
Set ie = CreateObject(“InternetExplorer.Application”)
With ie
.Visible = True ‘ デバッグ中はTrue、本番運用ではFalse推奨
.navigate url
‘ ページの読み込みが完了するまで待機
Do While .Busy Or .readyState <> 4
DoEvents
Loop
‘ HTMLDocumentオブジェクトを取得
Set htmlDoc = .document
‘ 記事本文のコンテナ要素を特定
‘ アメブロのHTML構造は様々
