本記事の内容
「Webサイトに記載されている情報を、Excelに自動で転記したい!」
「だけどやり方がわからない!」という方に向けた記事です。
Webスクレイピングとは?
「Webスクレイピング」とは、Webサイトに記載されているデータを取得することを指します。
「画像」「テキスト」「リンク先のURL」です。
これらのデータは手動でも取得可能です。しかし取得するデータが膨大にある場合はどうでしょう。
仮にリンクの数が100000個とかになったら、もはや手動で作業するわけにはいきません。
そこでプログラミングの登場です。プログラムを書けば、膨大なデータも短時間で自動取得できます。
「Webスクレイピング」という単語は、専ら「プログラミングでWeb情報を自動取得する」ことを指します。
余談
Webスクレイピングは主にAI界隈で多用される技術です。WebスクレイピングでAIモデリングの構築に必要なデータを収集します。
AIに限らず、業務でWebの情報をExcelに転記する作業を行ってる人は、こちらの記事を活用してみてください。
Webスクレイピングの手段
今回はExcelVBAを使ったWebスクレイピングの手法を紹介します。
Webスクレイピングの手段は他にも数多くあります。最も有名なのがPythonです。
ただしPythonを使う場合、PCにPythonをインストールする必要があります。
でも会社のPCって、個人利用目的のソフトインストールが禁止されてる場合が多いです。もっと普遍的なツールがいい。
阿部寛さんのホームページをWebスクレイピングしてみよう!
今回Webスクレイピングする対象サイトは「阿部寛のホームページ」です。
理由は2つあります。
- サイトの容量が軽い
- HTMLのコードが簡易で見やすく、練習サイトにうってつけ
補足
阿部寛さんのHPは、そのあまりのシンプルさで一躍有名になりました。(Wikipediaにページが作られるほど)
ご覧の通り、一昔前のテキストサイトを彷彿させるデザインです。
サイトの容量も当然小さく、リンクをクリックした途端に爆速で開きます。
- 「スマホが速度制限に掛かっても余裕で開く」
- 「コードが簡易で見やすいから、HTMLの写経練習になる」
- 「仮想環境のテストページに最適」
など、もはや阿部寛さんご本人のプロモーション以上の需要が見込まれています。
コバンダムでも、Webスクレイピング対象として活用させていただきます。
スクレイピングする内容
「阿部寛のホームページ」 内のリンクと、リンク先URLを取得し、Excelに転記します。
阿部寛の出演予定作品を表にできます。やったね!
今回使ったコード
Sub testIE()
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Dim objTag As Object
Dim objFrame As Object
Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
objIE.Visible = True 'IEを表示
objIE.navigate "http://abehiroshi.la.coocan.jp/" 'IEでURLを開く
Call WaitResponse(objIE) '読み込み待ち
Set objFrame = objIE.document.frames
Dim Row As Long, Col As Long 'シートに記述するための変数 Raw:行 col:列
Raw = 1 ' 1 : 1行目に表示
Col = 3 ' 3 : C列に表示
For Each objTag In objFrame("right").document.getElementsByTagName("a")
Cells(Raw, Col) = objTag.outerText 'リンク名の一覧を表示
Cells(Raw, Col + 1) = objTag.href 'リンク先のURLを表示
With ActiveSheet
.Hyperlinks.Add Anchor:=Cells(Raw, Col), Address:=Cells(Raw, Col + 1).Value
'リンク名に対応するハイパーリンクを貼り付ける
End With
Raw = Raw + 1
Next
End Sub
Sub WaitResponse(objIE As Object)
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち
DoEvents
Loop
End Sub
想定される出力結果
上記のコードをVBAに貼り付けてマクロを起動します。
するとC列、D列に以下の通りリンクとURLが転記されます。
C列 | D列 |
プロフィール | http://abehiroshi.la.coocan.jp/prof/prof.htm |
shigeta@navy.plala.or.jp | mailto:shigeta@navy.plala.or.jp |
2023年 大河ドラマ(第62作) | https://www6.nhk.or.jp/nhkpr/post/original.html?i=31903 |
「DCU」 | https://www.tbs.co.jp/DCU_japan/ |
夕霧花園 | http://yuugiri-kaen.com/ |
護られなかった者たちへ | https://movies.shochiku.co.jp/mamorare/ |
「HOKUSAI」 | http://www.hokusai2020.com/ |
とんび | https://movies.kadokawa.co.jp/tonbi/ |
異動辞令は音楽隊! | https://gaga.ne.jp/ongakutai/ |
このVBAを起動すれば、いつでもどこでも阿部寛の出演作品が瞬時に確認できます。
コードの流れ
流れを大まかに言うとこんな感じ
- オブジェクト変数の宣言
- 「阿部寛のホームページ」へブラウジング
- 「阿部寛のホームページ」からホームページの情報を読み取り、オブジェクト変数に格納する
- オブジェクト変数から、リンク先の情報(ここでは出演映画)を抜き取る。
- 出演映画一覧をExcelのシートへ転記する
注意
阿部寛のホームページは、昔ながらのフレーム形式を採用しています。
この形式の場合、スクレイピング方法に注意が必要です。
詳しくは手順③で出てきますが、情報を転記するときにフレームを指定する必要があります。
出演作品名は「right」のフレームに書いてあるので、コードも「right」フレームを指定します。
手順①:オブジェクト変数の宣言
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Dim objTag As Object
Dim objFrame As Object
objIE:IEでブラウジングするために必要な変数。
objTag:読み込んだHPの情報を格納するための変数。
objFrame:フレーム形式のHPの場合に必要。対象のフレームの情報を代入する。
手順②: 「阿部寛のホームページ」へブラウジング
Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
objIE.Visible = True 'IEを表示
objIE.navigate "http://abehiroshi.la.coocan.jp/" 'IEでURLを開く
Call WaitResponse(objIE) '読み込み待ち
Set objFrame = objIE.document.frames
コード | 解説 |
Set objIE = CreateObject("Internetexplorer.Application") | これでIEへのブラウジングが可能になる |
objIE.Visible = True | IEでブラウジングする様子が見えるようになる |
objIE.navigate "http://abehiroshi.la.coocan.jp/" | 対象のURLへブラウジングする |
Call WaitResponse(objIE) | URLへのフラウジングが終わるまでに待機 |
Set objFrame = objIE.document.frames | ホームページ内のフレーム構成の情報を代入する |
手順③: 阿部寛のホームページの内容をExcelへ転記
Dim Row As Long, Col As Long 'シートに記述するための変数 Raw:行 col:列
Raw = 1 ' 1 : 1行目に表示
Col = 3 ' 3 : C列に表示
For Each objTag In objFrame("right").document.getElementsByTagName("a") 'rightフレームのaタグを全て抜き出し
Cells(Raw, Col) = objTag.outerText 'リンク名の一覧を表示
Cells(Raw, Col + 1) = objTag.href 'リンク先のURLを表示
With ActiveSheet
.Hyperlinks.Add Anchor:=Cells(Raw, Col), Address:=Cells(Raw, Col + 1).Value
'リンク名に対応するハイパーリンクを貼り付ける
End With
Raw = Raw + 1
Next
End Sub
コード | 解説 |
Dim Row As Long, Col As Long | 行、列の数値を代入する変数を宣言 |
Raw = 1 Col = 3 | 行、列の番号を指定する(ここではC列の1行目を指定する) |
For Each objTag In objFrame("right").document.getElementsByTagName("a") | objFrameに代入されているHPの情報(rightフレームの情報)の中から、 aタグが付いてるものが見つかり次第処理をする。 |
Cells(Raw, Col) = objTag.outerText 'リンク名の一覧を表示 | C列1行目以降にリンク名を貼り付ける |
Cells(Raw, Col + 1) = objTag.href 'リンク先のURLを表示 | D列1行目以降にリンク先のURLを貼り付ける |
With ActiveSheet .Hyperlinks.Add Anchor:=Cells(Raw, Col), Address:=Cells(Raw, Col + 1).Value End With | C列のリンク名にハイパーリンクを貼り付ける処理 |
スクレイピングは書き方がほぼ決まっている
VBAのWebスクレイピングは書き方がほとんど決まっています。
序盤のオブジェクト変数を宣言したり、対象URLへnavigateする手順は他のプログラムでもそのまま使えます。