LoginSignup
12
20

More than 5 years have passed since last update.

Node.js + PhantomJS + Seleniumでスクレイピングする

Posted at

Node.js + PhantomJS + Seleniumでスクレイピングする

とくに何の目的もなく、
「そうだ、スクレイピングしよう」
と思ったので、ここに書いておく。

以前にやったんだけど完全に忘れてたので自分への備忘録として。

なんでSeleniumをつかった!言え!

スクレイピング目的ではcheerio-httpcliを使っているのを聞いたりするのだけれど、いまいちピンとこなかった。
あくまでスクレイピング専用、という感じだったし。

一方で、Selenium使えばブラウザの自動操作ができるから、

  • ルーチンの自動化
  • スクレイピング
  • テスト

とかいろいろできるやん。
それぞれでツールの使い方覚えるのとかめんどいしSelenium一個でええやん!
という考えでSeleniumを使うことにしたんだった気がする。

手順

  1. 適当にフォルダ作ってそこで作業開始
  2. npm i phantomjs-prebuilt -g
  3. npm i selenium-webdriver --save
  4. index.jsを書く(下のはTypeScriptで書いたけど、そのあたりは脳内でJavaScriptに変換かけてくれ)
  5. phantomjs -w(PhantomJSを起動して、操作を待ち受ける)
  6. 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();
})();

終わりっ!閉廷!…以上!皆解散!

12
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
20