【ExcelVBA】VBAでFirefoxを使うには
以前Seleniumを使ってVBAでスクレイピングする方法を紹介したのですけど、そのときのブラウザはEdgeでした。今回はFirefox(FF)です。
きっかけ
きっかけはこちらの質問です。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13274674623
エクセルVBAによるWEB連動にお詳しい方教えてください。
自身のYAHOO IDでログインをし、添付のようにYAHOO JAPANトップから
赤枠のニュース蘭をカテゴリ別にシートをVBAにて自動生成して
それぞれのシートに右図のようなニュース文字列を表示し、さらにリンクを付けて
クリックしたらそれぞれのYAHOOページに飛ぶようなマクロを
FIREFOXブラウザ(※IEじゃないです)にて行いたいです。ニュース表示内容はログインIDに依存しないかとは思われますが、なかなか
ログインできず苦戦しています。もちろん現行のYAHOOJAPANの仕様で
大丈夫です。宜しくお願いします。
調べてみたところ、VBAでFFを使うのはかなり難しくなっていました。
以前は楽だった
FFのバージョンが46まではWebdriverと一体だった(?)ので、わざわざWebdriverをダウンロードしてくる必要もなく、他のブラウザに比べてずいぶん楽でした。
Sub YAHOOにログインしカテゴリ別にシートを自動生成しリンクを貼る()
Dim Driver As Object
Set Driver = CreateObject("Selenium.WebDriver")
Driver.Start "firefox" 'ここでエラー
Driver.Get "https://www.yahoo.co.jp/"
ところが現在のバージョン(この記事執筆当時のFirefoxは109)ではエラーとなります。
なんで?
仕様変更?
詳しいことは分かりませんが、Firefoxのバージョン46までと47以降とでは、設計思想がだいぶ違うようです。Firefox側の問題なのかSelenium側の問題なのかよく分かりません。
FF46まではWebdriverはブラウザと一体になっているので、使う人はバージョン違いを気にする必要はありませんでした(・・・と、思われます。Web情報による。私も見てきた訳ではないので・・・)。
ところがFF47以降は、ブラウザとは別にWebdriverが必要となりました。FirefoxのWebdriverはgeckodriver.exeと言います。
では、このgeckodriver.exeをSeleniumのインストールフォルダに入れてあげればいいんじゃないかと思ったのですが、うまくいきません。
しかし、エラーは解消されず・・・orz
同一のフォルダにchromedriver.exeとかedgedriver.exeとかありますよね。これらはChromeだったりEdgeのドライバです。同じように整えているのに動かない・・・orz
試しにFireFoxのバージョンを下げてみる
試しにFirefoxのバージョンを下げてみました。
無事Yahoo!のTopページが表示されました。
ここまではよかったのですが、問題は次です。
Sub YAHOOにログインしカテゴリ別にシートを自動生成しリンクを貼る()
Dim Driver As Object
Set Driver = CreateObject("Selenium.WebDriver")
Driver.Start "firefox"
Driver.Get "https://www.yahoo.co.jp/"
Driver.FindElementByCss("#StatusMail > a > dl").Click 'ここでYahoo!が推奨ブラウザでないと表示
Driver.FindElementByCss("#username").SendKeys ("hogehoge")
Driver.FindElementByCss("#btnNext").Click
Driver.FindElementByCss("#passwd").SendKeys ("Password")
Driver.FindElementByCss("#btnSubmit").Click
Stop
End Sub
テストに使っていたコードは上記のとおり(ユーザIDとパスワードは実際のものとは異なります)なんですが、Yahoo!メールにログインする画面に遷移する個所でYahoo!から「推奨ブラウザでない」との表示がありました。
なんと・・・・。
そりゃそうですよね、何十代も前のバージョンのブラウザではセキュリティ上問題があります。
やはりFF46以前を使うのはダメですね。
他言語での使い方
VBAで最新のFirefoxを使うのは無理なのか、引き続き調べていたところ、他言語では次のように記述すれば使えることが分かりました。
System.setProperty("webdriver.gecko.driver", "C:\GeckoDriver\geckodriver.exe"); //←これが新しい
WebDriver driver = new FirefoxDriver();
driver.get("http://seleniumhq.com");
最初にSystem.setPropertyでgeckodriver.exeへのパスを教えてあげればよいらしいです。
PythonとかKotlinとかでも同じです(似たような感じでパスを教えてあげる方式)。
じゃあ、VBAでは?
調べてみたけれど、分かりませんでした。
どうもSelenium側がすでにVBAについては開発を止めているらしいです。
VBAでスクレイピングすること自体、もうあんまりやらないと思われているようです。確かにVBAと相性のよかったInternetExplorerが終わりましたもんね。VBAも”終わったコンテンツ”だと思われても仕方ないのかもしれません。
そ・・・・そんなあ!><
Seleniumを使わないでWebdriverを使う
仕方がないのでWebdriverをSeleniumなしで使う方法を模索しました。
幸い次のような良記事を発見しました。
①Excel VBAでSeleniumBasicを使わずにスクレイピングする
https://qiita.com/uezo/items/66e20b064ffd5f239b9a
②SeleniumなしでWebDriverを操作するには – Part1
https://zenn.dev/ymd65536/articles/e13f278a5d9803
①はブラウザがChromeとEdgeなんですが、Firefoxにも使えそうです。
②はPOSTしたときのEdgeの戻り値について書いてあって、Firefoxの場合にも同様に戻り値を見ればいいんだ!と目から鱗でした。Part2もあるようで、読むのが楽しみです。
まとめ
という訳で、VBAでSeleniumを使うならFirefoxはあきらめた方がよいです。別のブラウザを選ぶべき。
どうしてもFirefoxでスクレイピングしたいなら、Selenium以外を使うか、全く使わず自前でWebdriverを使うしかないようです。
私はこのSeleniumを全く使わず自前でWebdriverを使う方法を①と②のサイトを見ながら試してみようと思います。
続きます。
蛇足:夫に「FirefoxがVBAで使えなくてさーーー」と愚痴ったら、「オワコンにオワコンだからじゃね?」と悪口を言われました。くそぅ(;`皿´)グヌヌ
Firefoxはオワコンじゃないですよ!VBAはあやしいけど・・・。
あれ?もしかして私?私がオワコン!?
-
前の記事
【PowerPointVBA】画像を挿入して整列 2023.02.04
-
次の記事
【ExcelVBA】VBAからFirefoxをSeleniumなしでスクレイピング 2023.02.06