こんにちは、hokkyokunです。
今回はVBAでのWebスクレイピングはお勧めしない理由を解説していこうと思います。
スクレイピング(Web scraping)とは、ウェブサイトから自動的にデータを取得する技術や手法のことです。通常、人間がブラウザを使って手動で情報を収集するのに対し、スクレイピングではプログラムを使ってウェブサイトの内容を効率的に収集します。
結論から申し上げますと、以下の理由でVBAでのスクレイピングはお勧めしていません。
- 良くも悪くもVBAはマイクロソフト系ツールに特化しすぎている
- インストールするものがたくさんあり、準備が大変
- VBAコード情報が少ない
- 機能面でもPythonの下位交換でしかない。
VBAでのスクレイピングは準備が大変です。
仮に複雑な準備をこなしたとしてもVBA自体が古い言語のためいろいろと(特に配列やエラー回避系)不便なところがあり、コードが複雑化します。
加えて、ウェブの読み込みの待ち時間が設定できないため動的なページ(特定の位置までスクロールすると再読み込みして続きが読める系のページ)には対応できません。
ちょっと辛口になってごめんなさい。
本当に特別な事情があってVBAしか使えない環境でない限り、(頑張って習得してでも)Pythonを使うことを考えてみてください。
Pythonを使ったスクレイピングのメリットは下記で詳しく述べたいと思いますが、ざっくり結論を申し上げますと以下の通りです。
- スクレイピングの設定・準備はほぼ不要
- 情報が多い
- コードが簡潔でわかりやすい(可読性が高い)。
- スクロール・複数タブ使用・ヘッドレスモードなど自由自在にブラウザ操作
詳しく解説してきます。
VBAでスクレイピングはおすすめ「しない」理由
良くも悪くもマイクロソフト系ツールに特化しすぎている
いろいろなところでいっていますが…
まず前提としてVBAは大好きです。VBAに助けられてたことは何度もありますし、今もVBAを使う場面は多いです。
が、それはマイクロソフト系のツール(エクセル・アウトルック等)に限ったことです。
以前はインターネットエクスプローラー(IE)というブラウザをみんな使っていた時代があります。
IEを動かすのであればVBAでも簡単にできたのですが、IEはサポート終了しました。
今はchromeやedgeを使うことが多いと思いますが、これらをVBAで動かそうと思ったらちょっと大変です。
VBAはマイクロソフト系のツールを使うにはめっぽう強いですが、他のツールを動かそうと思うととたんに難易度が跳ね上がります。
いろいろな理由があると思いますが、
- プログラミング言語が古い
- プロのエンジニアがほとんど使わないため、ライブラリの更新やサポートがないもしくは弱い
この二点が起因して使いづらく、使いづらいから、使用人口も減ってサポートもなくなるという悪循環が起きていると思われます。
VBAはマイクロソフト系のツールに限定したほうが良い
VBAは準備がめちゃくちゃ大変
VBAでスクレイピングしようと思うと準備にものすごく労力がかかります。
以下に手順の概要をご紹介しますので、「めちゃくちゃめんどくさいことをしている」ということが実感いただけたら幸いです。
- Seleniumをインストールする
- Chromeドライバーをインストールする
- 参照設定を調整する
【手順1】Seleniumをインストールする
Selenium Basicは、VBA(Visual Basic for Applications)からWebブラウザを自動操作するためのツールです。
通常、PythonやJavaなどのプログラミング言語で使用されるSeleniumを、VBAでも使えるようにするラッパーライブラリです。
これを使うことで、ExcelやAccessなどのVBA環境からブラウザを操作し、Webページから情報を取得したり、自動化処理を行うことができます。
【手順2】Chromeドライバーをインストールする
2025年1月6日時点ではこのサイトにアクセスしドライバーをインストールします。
「Stable」をクリックすると内部リンクで、下記の画面までスクロールするのでお使いのOSに該当するURLをコピペして検索に投げます。
そうするとzipファイルがダウンロードされるのでそれをクリックして展開します。
この後も展開がありますが、このページはVBAでの環境構築の解説記事ではありませんし、面倒な作業が続くので、書くのやめます。。。
【手順3】VBAの参照設定の調整
VBAの「ツール」⇒「参照設定」を開きます。
以下のライブラリを参照するようにクリックします。
- Selenium Type Library
- Microsoft HTML Object Library
いかがでしょうか。
ちなみに私は過去にVBAでスクレイピングをやっていました。
この記事を書くためにスクレイピングプログラムを起動してみましたが、エラーが出て動きませんでした。
インストールしているドライバーのアップデートがされていなことが原因でした。
VBAは準備をした後も自分で定期的にメンテナンスをしなければいけません。
一方でPythonはノーメンテナンスで使用できるライブラリがあります。
- VBAスクレイピングは準備がとてつもなく大変。
- 定期的なメンテナンスも必要!
VBAスクレイピングの情報量が少ない
ネットでVBAのスクレイピングの記事を検索してもあまり有用な記事は見られません。
スクレイピング初心者がこれらの記事で適切にコーディングしていくことは至難の業です。
では、書籍はどうなのか。
アマゾンで「VBA スクレイピング」で検索してみました。
実際にVBAでスクレイピングしている書籍は数えるほどしかなく、以下の書籍くらいです。
ただし、これらもインターネットエクスプローラー対応なのでそのまま使えず、結局、様々な情報を収集しながら試行錯誤しないと使い物になりません。
VBAスクレイピングは情報を収集するだけでもとても労力がかかります。
機能面でもVBAはPythonの下位交換でしかない
これはVBAユーザーから反感を買いそうですが(笑)
現代のウェブページでは静的なページはどんどん少なくなっています。
例えば特定の位置までスクロールすることでページの再計算が行われて、続きがその下に続くというページを見たことがある人もいると思います。
アマゾンやYouTubeはまさにそれ系のページですよね。
そういったページをスクレイピングしようと思うと、以下の動作が必要です。
- 特定の位置までスクロール
- ページが読み込まれるのを待つ
この動作を反復し、これ以上読み込まれないところでプログラムを終了させるアルゴリズムが必要ですが、VBAでこれを書くのは通常できません。
もしかしたらプロのエンジニアならできるかもしれませんが、普通の非エンジニアがちょこっとコードを書くぐらいでは難しいでしょう。
というか、そんな労力があるなら別の言語を使った方がよっぽど生産的だと思います。
VBAとPythonをスクレイピング機能に関して、さらにページ下部(Pythonのメリット:高度なスクレイピング機能が使える)で比較しているので参考にしてみてください
スクレイピングするならPython一択。その理由
スクレイピングしたいならPythonをおすすめします。
その理由ですが、VBAをおすすめしない理由の逆です。
- スクレイピングの設定・準備がほぼ不要
- 情報が多い
- コードがわかりやすい(可読性が高い)
- 多様なスクレイピング機能が使える
スクレイピングの設定・準備がほぼ不要
Pythonはスクレイピングの準備がほぼ不要です。
唯一必要な準備は以下です。
たったこれだけです。
しかもライブラリをインストールするには
Windowsの場合はコマンドプロンプトを開いて
pip install selenium
このコマンドを打つだけです。
なれればインストールの待ち時間を含めても一分以内で終わります。
以前はこうではありませんでした。
私がスクレイピングを始めた3~4年ほど前は自分でWebDriverというものをダウンロードしなければいけませんでした。
しかも、使用しているブラウザのバージョンに合わせたドライバーをインストールしなければいけないので、グーグルがchromeを更新するたびにインストールをし直さなければいけませんでした。
今はSeleniumライブラリがパワーアップしており、そのあたりを裏側で実行してくれます。
ユーザーはSeleniumというライブラリを一度インストールすれば、後のメンテナンス(ドライバーのインストールとアップデート)する必要がなくなりました。
情報が多い
Pythonは日本人に人気のプログラミング言語であり、たくさんの書籍やネット情報があります。
情報がたくさんあるので、困ったことがあったときにググればたいていのことは解決します。
note.nkmk.meというサイトはよく参考にさせていただいております。
ありがとうございます。
ただ、後述しますが、Pythonは奥が深すぎて、無料のネット情報だけで学習するのはおすすめしません。
私の経験上の話ですが、ネット上にある無料の情報をもとに、VBAと同じように学習すると、理解し、使えるようになるまでとてつもなく時間がかかることになるかもしれません。
ネットは詰まったときの検索として使い、書籍や動画での学習をおすすめします。
ちなみにアマゾンでPythonを検索すると初心者向きの書籍がたくさんあります。
初心者でも少し学習すれば、実現可能なことがたくさんあります。スクレイピングはその一つですね。スクレイピングって実はそんなに難しいことはやっていないんです。
コードがわかりやすい(可読性が高い)
Pythonはわかりやすく、初心者向きの言語といわれています。
どういうことかというと、
詳しくはVBAとPythonのコードを比較した記事があるので参照してみてください。
株価データから月当たりの価格変動率を計算し、
グラフ化するプログラムをVBAとPythonで書いてみました。
その違いについてシリーズで解説しています。
可読性が高いというメリットはコードを書いたことがある人は共感してくれると思います。
プログラムって、自分で書いておきながら、どういうアルゴリズムで実現しているのかついつい忘れちゃくことがよくあります。
そういうときは自分で書いたコードを読み返して、メンテナンスをやるのですが、読みやすさ(可読性)が良くないと、メンテナンスに多大な労力を割いてしまうので、すごく大事な要素です。
残念ながらVBAは可読性が高い言語とは言い難いので、複雑なコードはPythonで書くことをおすすめします。
高度なスクレイピング機能が使える
ページ上部でVBAでは動的ページのスクレイピングが難しいということをお話ししました。
その続きとして、Pythonだとできる(もしくは簡単)だが、VBAだとできない(もしくは難しい)機能を一覧にしました。
機能 | VBA | Python |
---|---|---|
動的ページのスクレイピング | 難しい | 簡単(Seleniumで可能) |
Java Scriptの実行 | 難しい | 可能(Seleniumで可能) |
ヘッドレスモード (バックグラウンド処理) | 不可能 | 可能(Seleniumのヘッドレスモード) |
待機処理 | 手動でループコードを書く | 簡単(WebDrivarWaitで自動待機) |
非同期処理(並列スクレイピング) | 不可能 | 可能(asyncio,aiohttp) |
画像スクレイピング | 難しい | 可能(requests,Pillow) |
ほかにもありますが、非エンジニアがスクレイピングでしたい処理での大きな違いは上記のようなものかと思います。
動的ページのスクレイピング、JavaScriptの実行
現代のウェブページはHTMLやCSSだけで書かれているものはほとんどありません。
なんらしかの動き(写真が続きに表示されたり、ボタンを押すことで隠れていた部分が表示されたり)はJavaScriptというプログラミング言語を使って書かれています。
Pythonであればそういった動きを簡単に操作することができます。
VBAであれば非常に困難です。少なくとも非ITエンジニアが無理して使う技術ではありません。
待機時間
これも動的ページのスクレイピングに関連することですが、ページが読み込まれてから実行をするという基本的な動作がVBAだと難しくなります。
Pythonなら一行で書けるので、とても簡単です。
非同期処理スクレイピング
同時に複数のページ処理が可能です。
やや離れますが、VBAは実行速度も遅いです。
結果として、処理が終了するまでに長い時間が必要となります。
画像スクレイピング
Pythonならウェブページから画像を取得することが可能です。
Pythonにデメリットはある?あえていうなら…
Pythonを使っていて、デメリットってあまりないのですが、強いて言うなら以下の二つかなと思います。
- Pythonを使うための環境構築の必要性
- 未学習者は学習コストがかかる
一つ一つ見ていきましょう。
【デメリット①】Pythonの環境構築が必要
Pythonは現状のWindowsPCに関してはデフォルトでは入っていないのでPythonが使えるように自分で環境構築する必要があります。
VBAでスクレイピングするための準備のほうがよっぽど大変です。
Pythonの環境構築は特定のウェブページにアクセスしてダウンロードして、自身のPCにインストールするだけです。
こちらからダウンロードできます(公式ページ)。
少しダウンロードページがわかりにくいので非公式ですがこちらのページもあります。
実際にはコードエディタもインストールしたほうが良いですが、これを含めてもおそらく30分以内で終わります。なれれば5分くらいでできます。
VBAのスクレイピング環境構築より簡単なのは保証します(笑)
【デメリット②】学習が必要
Pythonは学習しないで使えるものではありません。
当たり前ですが…
chatGPTのようなAIを使うことで高度なプログラミングは自動で作ってもらえる時代になりましたが、現状作ってもらったコードを、全く手直しなしで使えるようにはなっていません。
コードの不備はプロンプト(AIへの指示)の精度を上げることである程度解消できます。
ただ、プロンプトの学習も大事ですが、プログラミング基礎ぐらいは把握しておかないと、そもそもAIが作ったコードが優れているのかどうかの判断すらつきません。
せっかくVBAを習得したのに今からPythonを一から覚えるなんて…というかたはスクレイピングだけでも頑張ってPythonでやってみてください。
スクレイピングでとった情報をcsvやエクセルに落として、それをVBAで読みこんで編集する。ってだけでもPythonの学習コストを抑えられます。
私も最初そうやっていました。
スクレイピングでとった情報をVBAで操作していました。
ただ、そのうちそれも面倒になってきて全部Pythonで完結したくなりました(笑)。情報処理に関してもPythonはとても優れていますので、学習する価値は全然あります!
VBAを学べてきたならプログラミングの素質は十分にあるので、Pythonも比較的早く使えるようになると思います。
学習にはある程度お金をかけたほうがいい理由
日本人はPythonが大好きで、日本語での無料のブログ記事やWebサイトがたくさんあります。
これは非常に便利で私もよくお世話になっております。が、これだけで学習することはおすすめしておりません。
理由は二つあり
- ネットの記事をかいている人がガチのエンジニアであることが多い
- Pythonは奥が深すぎるので、ネットの断片的な知識では限界が来る
【ネット記事はガチエンジニアが書いているケースが多い】
一つ目ですが、
プロのエンジニアの方が副業や趣味・自己研鑽的な意味合いでネット上で無料公開している記事が多いのですが(いつもありがとうございます!)、高度すぎてついていくのがかなり難しいものもたくさんあります。
専門用語とかlinuxのコマンドとかさらっと出てきます(笑)。GitHubって何?みたいな。
非エンジニアでVBAをメインで使っている人にとってはかなり難解な横文字がたくさん出てきて大変な思いをする人もいるんじゃないでしょうか(私もそうでしたし今でも?って思う単語たくさんあります)。
【Pythonは奥が深すぎる問題】
Pythonは奥が深いです。
様々なことが魔法のようにできます。
PythonだけでWebサイトを運営することも可能ですし、AIの開発もできます。OCRで画像を読み解くこともできるし、自動翻訳も作れます。
ですので、最初は簡単な書籍を一冊だけでもいいので、一冊買ってしっかり学習することをお勧めします。
VBAとPythonコード比較
最後におまけとして、
VBAとPythonでのスクレイピングのコードを比較してみます。
VBAとPythonでコードにどんな違いがあるか参考にしてみてください。
以下のような解析を行ったとします。
「class1
」というクラス属性を持つdiv
タグ内の「class2」
というクラス属性を持つp
タグだけを取得します
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>サンプルページ</title>
</head>
<body>
<div class="container">
<div class="class1">
<p class="class2">ターゲットのタグです。</p>
<p class="class3">これはターゲットではありません。</p>
</div>
<div class="class4">
<p class="class2">これはターゲットではありません。</p>
</div>
</div>
</body>
</html>
VBA
Sub GetElementsByCssUsingSelenium()
On Error GoTo ErrorHandler ' エラーキャッチ開始
Dim driver As New Selenium.ChromeDriver
Dim elements As Selenium.WebElements
Dim element As Selenium.WebElement
Dim result As String
Dim i As Integer
' Chromeを起動して指定URLを開く
driver.Start "chrome"
driver.Get "https://example.com"
' CSSセレクターで特定のクラス名を持つdiv内のpタグを取得
Set elements = driver.FindElementsByCss("div.class1 > p.class2")
' 要素が見つからなかった場合の処理
If elements.Count = 0 Then
MsgBox "指定された要素が見つかりませんでした", vbExclamation
GoTo CleanUp
End If
' 要素のテキストを取得
i = 1
For Each element In elements
result = "要素 " & i & ": " & element.Text
i = i + 1
Next element
CleanUp:
' Chromeを閉じる
driver.Quit
MsgBox "取得完了", vbInformation
Exit Sub
ErrorHandler:
' エラー時の処理
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Resume CleanUp
End Sub
次はPythonです。
Python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
try:
# ChromeDriverのパスを指定してブラウザを起動
driver = webdriver.Chrome()
# 指定URLを開く
driver.get("https://example.com")
# CSSセレクターで特定のクラス名を持つdiv内のpタグを取得
elements = driver.find_elements(By.CSS_SELECTOR, "div.class1 > p.class2")
# 要素が見つからなかった場合の処理
if not elements:
print("指定された要素が見つかりませんでした")
except NoSuchElementException:
print("指定された要素が見つかりませんでした(NoSuchElementException)")
except TimeoutException:
print("ページの読み込みがタイムアウトしました(TimeoutException)")
except WebDriverException as e:
print(f"WebDriverエラーが発生しました: {str(e)}")
finally:
# ブラウザを閉じる
driver.quit()
VBAでもjavascriptをベースとしたコードを採用しているので、解析自体はそこまで難しくはありませんが、以下の点でVBAはデメリットがあります。
- 配列などの基本構造が使いずらく、冗長
- エラーハンドリングが貧弱
配列処理はVBAでも使いずらい箇所の一つで、プログラミングの基本的な操作にも関わらず冗長となってしまいます。
少し話はそれますが、
配列を使いやすくする関数を作っていますのでよかったら見てください
配列以外にもエラーキャッチがVBAは貧弱です。
ターゲットとなるウェブページのhtmlが変更されていた場合、エラーキャッチをしっかり組んでいないと、すぐに止まってしまうダメなコードになってしまいます。
上記のコードでもわかるようにVBAのエラーハンドリングは原因を細かく分析することができません。
また、エラーキャッチをおろそかにしているとその後の修正でも時間がかかってしまい、メンテナンスに無駄な労力がかかってしまいます。
Pythonの方が一行一行何がしたいコードなのかが明確で、後々見ても可読性が高いコードです。
こういうコードはメンテナンス性が高く、生産性も高い良いコードとなります。
Pythonを効率的に学習する方法
私の失敗例
私は学習の第一歩として書籍を買いました。
私が買った書籍は以下のものです。
ちょっと引くぐらい買ってますね(笑)
でも、これは一部で、まだまだここにはない本もたくさん買っています。
自己投資と称して散財していますね。
なぜこんなにたくさん買ったかというとPythonは覚えても覚えてもやることが無限に湧き出るからです。
しかし、英語の公式ドキュメントを見ながら学習するのはハードルが高く、結局書店で新しいPythonの本を見つけては「このコードは知らないやつ!」と思って買っちゃうんですよね。
あと、本は、内容が多そうに見えて、実はそうでもないです。
2~3時間で終わってしまうくらいの内容しか載せていない場合もあります。それがいい悪いではなく、紙媒体で表現するには限界があるということだと思います。
失敗から学んだお勧めの学習方法
私の学習の反省点を踏まえ、以下のような方法をお勧めします。
まず、書籍を一つ買ってください。内容が簡単かつ環境構築が載っているものが良いですね。
インスタントに環境構築しているものはダメです。例えばGoogle Colaboratoryでコードを動かそうとしている書籍はNGです。
きちんとPythonをインストールさせ、エディターの設定まで書いているものが望ましいです。
こちらがおすすめですね。
Pythonのインストール方法が載ってあります。
それでまずは自分が楽しいと思えるかどうかを大事にしてください。
基礎学習はそれでおしまいにし、次はメンターを見つけて学習を進めてください。
つまり、現役のプロエンジニアに教わることをお勧めします。
上記で書いたようにPythonはできることが無限にあり、わからないことも無限に湧いて出てきます。
書籍を買っていると逆に割高になることもありますので、高額ではないオンラインスクールでメンターに直接指導をもらった方がコストパフォーマンスは高くなります。
安価かつ、月額性のおすすめのオンラインスクールは以下のものです。
侍エンジニア
VBAを扱っている人はおなじみではないでしょうか。
VBAコード検索でよく見かけますよね。
Freeks
もっと本格的にかつ、キャリアアップを真剣に考えるならこちらがお勧めです。
私も副業でココナラやブログをやっていますが、実務経験がないというのはかなり大変です。なんせ足がかりがないんですから。
月額10,780円のサブスク料金です。
Freeksは副業案件を紹介してもらえます。未経験でも仕事を受けることができるので、キャリアアップは独学よりもしやすいです。
また、FreeksはPython以外の言語も同じ料金で学び放題です。
Pythonをやっているとわかるのですが、HTMLやCSSの知識も必要になりますし、javascriptも理解しておくと、できる幅がさらに広がります。
ちなみには私はHTMLやjavascriptの本も買いました(笑)
はっきり言ってオンラインスクールに行くよりも使っています。
PyQ
Pythonに特化したオンラインスクールです。
機械学習や統計分析、Webアプリなどの実務的な使い方の学習カルキュラムも充実しています。
こちらもサブスク費用でして、月額3,040円のライトプラント月額8,130円のスタンダードプランがあります。
おすすめはスタンダードプランです。なぜなら、現役エンジニアへの質問が可能だからです。
学習する速度の差は質問できる環境があるかどうかにかかってきます。
とはいえ、(比較的安価なスクールといえど)安い買い物ではないので、ご自身の立場や今後のキャリアを考えてご決断ください。
VBAの知識は資産です
私個人の感想ですが、VBAを学んできたことは資産であると思います。
ただ、現実は甘くない。
当初はこれで転職をするとか、会社で社内SE的立場で会社の業務効率化を加速させてやろうと思っていました。
この二点は見事に外れました。私が思っているほどVBAの価値を世間は認めていないようです。この点はVBAユーザーは直視しないといけません。
少なくともPythonはVBAのプログラミング的思考が応用できるので、実現したいことに対するアプローチの理解は無学者よりも格段に速かったと思います。
例えば、プログラミング未経験で、for文とwhile~loop処理をがっちり使い分けするのは結構難しいんじゃないでしょうか。
でもVBAをやっていれば使い分けは簡単ですよね。
英語を勉強した後に、ドイツ語を勉強するような感覚です。
私は年齢的にプロのエンジニアという立場で働くことはあきらめましたが、ブログという戦場でプログラミングの知識を生かしたいと思います。
誰も雇ってくれないなら自分が事業主になるという、のび太君的発想です。
一緒にプログラミング頑張っていきましょう。
ではでは。