はじめに
過去の人 @riocampos ですw
Ruby で動的なサイトの Web スクレイピングをするときに、Selenuim をラップした Watir を使って動的なHTMLを取得していました。Selenium だと低水準なところに気を遣わないといけないのですが、Watir はうまく Rubyish に(オブジェクト指向っぽく)ラップしてくれていて、とても使いやすいライブラリです。(なお Capybara は自動化テスト向けなので私にはややこしくて重い。)で、目的の動的 HTML を取っちゃえば、あとは使い慣れた nokogiri でギコギコ切ってやれば良いわけですw
過去に書いた記事(もう2015年かよw):
Puppeteer とか Playwright とか
最近 Python の勉強をしていますが、やりたいのはやはり動的サイトの Web スクレイピングなのです*1。そこで Python でもどうせ Selenium を使わなきゃいけないのだろうなあと思いつつ調べていたら、pyppeteer とか playwright-python とかいうのがあると。
んで大元はそれぞれ Puppeteer と Playwright。ザザッと調べてみると、Selenium 一辺倒のところから Puppeteer (Google 支援)が出てきて、その開発チームが Microsoft に移って Playwright を作った、他方で puppeteer も別チームが開発継続してる、とか…。「元祖」「本家」的なw
脱線から戻ります。Ruby でも Puppeteer だの Playwright が使えるライブラリがあるんじゃないかなと思って探してみると、同じ人が puppeteer-ruby と playwright-ruby-client を作ってます。
実際にRubyクライアント書いてみた
そのひとが blog で
- いよいよPuppeteerを使う理由がなくなってきた。これからはPlaywrightの時代だ (2021/04/19記事)
とか書いてるので、まあ Playwright を Ruby でも Python でも使えばいいのかな、と思いました。
なお Puppeteer と Playwright 両者の違いとして
Puppeteerは単純にCDPを使うことに特化したツールキットなのに対し、Playwrightはブラウザオートメーションのオールインワンツールキットという感じだ。
また
なので、playwright-ruby-clientを作っているから、puppeteer-rubyはもうオワコン?とはならない。用途が全然違う。
playwright-ruby-clientはどちらかというと、Ferrumに近い位置づけで、今後はCupriteのようなCapybaraドライバを作ったり、Vesselのようなクローラー書く仕組みを作ったり、みたいな方向性で成長させていく必要がある。
puppeteer-rubyはあくまでCapybaraとの「共存」ができることを強みに、(本家Puppeteerがなくならない限りはw)育てていくだろう。
いよいよPuppeteerを使う理由がなくなってきた。これからはPlaywrightの時代だ (2021/04/19記事)
とも。Capybara は使わないので、やはり私は Playwright を扱えるようにしよう。
そして。
JavaScript界隈ではCypressをはじめとして、優秀なE2Eテストフレームワークやブラウザ自動操作ライブラリがあるが、Rubyはというと現実的にはSeleniumしかないみたいな状況がずっと続いている。
ただ、IEがほぼ滅んだ今となってはRubyでもPlaywrightはSeleniumと同様に使っていけるはず。
いろいろOSS開発はしてきたが、そろそろSeleniumが唯一無二の選択肢みたいな状況には終止符うちに行きたいなと思っている。
ありがたい。
Ferrum
で。そのライブラリ開発者の方のブログのなかで
RubyからCDP(Chrome DevTools)を使ってブラウザを自動操作できるライブラリはFerrumなどがあるが、それらはみなChromeしか自動操作できない。Firefoxも自動操作できるのは世界でpuppeteer-rubyだけ
と書いていたのを見つけて「 Selenium 以外を使って Web ブラウザを使えるライブラリが他にもあるのか」と少し驚きました。ので、今後ちょっと動かしてみたいと思っています。作者は CDP(Chrome DevTools Protocol)に基づいた gem をいろいろ作ってるようですね。なお上に書いた Puppeteer と Playwright も CDP を使ってるようです。
Ferrum 参考記事:
*1:というかそこにしかモチベがないというか