Node.js + PhantomJS + Seleniumでスクレイピングする
とくに何の目的もなく、
「そうだ、スクレイピングしよう」
と思ったので、ここに書いておく。
以前にやったんだけど完全に忘れてたので自分への備忘録として。
なんでSeleniumをつかった!言え!
スクレイピング目的ではcheerio-httpcli
を使っているのを聞いたりするのだけれど、いまいちピンとこなかった。
あくまでスクレイピング専用、という感じだったし。
一方で、Selenium使えばブラウザの自動操作ができるから、
- ルーチンの自動化
- スクレイピング
- テスト
とかいろいろできるやん。
それぞれでツールの使い方覚えるのとかめんどいしSelenium一個でええやん!
という考えでSeleniumを使うことにしたんだった気がする。
手順
- 適当にフォルダ作ってそこで作業開始
npm i phantomjs-prebuilt -g
npm i selenium-webdriver --save
- index.jsを書く(下のはTypeScriptで書いたけど、そのあたりは脳内でJavaScriptに変換かけてくれ)
-
phantomjs -w
(PhantomJSを起動して、操作を待ち受ける) node index.js
index.ts
// Seleniumの機能をインポート
import * as SeleniumWebdriver from "selenium-webdriver"
// ブラウザをつかうための設定。phantomjsはデフォルトだと8910番を使うので固定。
const driver = new SeleniumWebdriver.Builder()
.forBrowser('phantomjs')
.usingServer('http://localhost:8910')
.build();
// ブラウザ処理はロード待ち描画待ちなどあるため、基本的にPromiseで値を返す。
// thenしまくるのは辛いのでasync/awaitを使うことで簡単になる。
(async function() {
// ここの以下6行だけが、実際のスクレイピング。
await driver.get('http://example.com');
// jQueryみたいにDOM指定したいので関数として$を定義する。
const $ = (x: string) => driver.findElements(SeleniumWebdriver.By.css(x))
const xs = await $('h1');
const x = xs[0];
const text = await x.getText();
console.log(text);
// 終わったら閉じる。
driver.quit();
process.exit();
})();
終わりっ!閉廷!…以上!皆解散!