node.jsでスクレイピング

node.jsでスクレイピングをする時のメモ。

Protractorを使う。Protractorはnode.jsで動く癖に内部でSeleniumを動かしているためJavaの実行環境が必要になる。インストールしましょう。
厳密にはProtractorがWebDriverJSを内部で使い、WebDriverJSがSeleniumServerを動かすらしい。多重下請け構造かよ….。ProtractorはもともとAngularJSのテストツールなので、AngularJS用のAPIが提供されたWebDriverJSだと思えばいいと考えると、スクレイピングするだけなら別にProtractorである必要はない。まぁ対象がAngularJSじゃないという保証もないので黙って使っておけばおk

そーす

https://github.com/grazios/scrape-test.git
ここに全部おいてあります。

まずはprotractorをInstallする

npm install -g protractor  

これで入る。

SeleniumServerをいれる

webdriver-manager update  

globalでprotractorをインストールすればwebdriver-managerも使えるようになっているはず。

入れるというかアプデですな。

2015/02/24追記 seleniumのstandaloneをインストールしていた。あとchromedriverも。  
グローバルにインストールせず、Localにインストールした場合は、
node_modules/protractor/bin  
のWebDriverをたたいてやる必要がある

protractorの設定ファイルを書く

exports.config = {  
  //実際にスクレイピングする指示書置き場(テストSpec)
  specs: ['spec/**/*.coffee'],
  //テストフレームワーク
  framework: 'mocha',
  //テストフレームワークのオプション
  mochaOpts:{
    reporter: 'spec',
    ui: 'bdd'
  },
  //動かすブラウザ
  capabilities:{
    'browserName': 'chrome'
  }
}

オレオレ設定ファイルなので保証はしない! mochaを使いたいのでmochaを設定している。よくみるのはjasmineだけどどっちがいいんだろうね。
なんかいろんなドキュメントとかリファレンスにはSeleniumAddressとかServerとか指定しろみたいに書いてあったりするけどなくても行ける。勝手にサーバ立てて実行してくれるよ。なのでwebdriver-manager startをやる必要もなし

mochaをいれる

npm i -D -g mocha  

Globalで入れておくとらくちん

chaiをいれる

mochaでexpectとか使うためにchaiを選択。

npm i -D chai  

coffee-scriptをいれる

楽したいからcoffeeでかく

npm i -D -g coffee-script  

Specを書く

protractorのspecsで指示した場所に適当にファイル作って書く

chai = require 'chai'  
chaiAsPromised = require 'chai-as-promised'  
chai.use chaiAsPromised  
expect = chai.expect

describe “動作チェック",()->

  it "it works",->
    expect(true).to.be.true

実行

protractor protractor.conf.js  

↓実行結果

Starting selenium standalone server...  
[launcher] Running 1 instances of WebDriver
Selenium standalone server started at http://192.168.100.101:62728/wd/hub


  動作チェック
    ✓ it works (55ms)


  1 passing (219ms)

Shutting down selenium standalone server.  
[launcher] 0 instance(s) of WebDriver still running
[launcher] chrome #1 passed

この時点で動いてない人は何かが間違ってる。

スクレイピング用のSpecを書く

describe "Googleのスクレイピング",->  
  it "title",()->
    browser.getTitle().then (title)->
      expect(title).to.be.equals("Google")

スクレイピングといいつつタイトルをとってくるだけ…今回はここまで!