JavaScriptを使用したページが多くなり、一昔前のツールではスクレイピングできないページに行き当たることが多くなりました。そこでSeleniumのようなブラウザを操ることができるツールが出てきて、JavaScriptを使用したページのスクレイピングやテストができるようになりました。
しかし、GUIブラウザを起動してコントロールさせてとなると、とても時間がかかる。そこでGUIのないブラウザ、ヘッドレスブラウザの登場となりました。
CasperJSは、ヘッドレスブラウザを使ったクライアントサイドテストやスクレイピングをより簡単に記述できるツールです。
対応しているヘッドレスブラウザは、PhantomJS(WebKitベース)とSlimerJS(Gekoベース)です。ただし、SlimerJSは厳密にはヘッドレスではなく、GUIブラウザを起動しています。
実例
以下のようなページを用意します。一昔前のスクレイピングツールではtitleを取り出した場合、”書き換え前”となってJavaScriptによる処理を拾えませんでした。
html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <link rel="stylesheet" href="" type="text/css" media="all" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> <script type="text/javascript" charset="UTF-8"> $(function(){ $("title").text("書き換え後"); }); </script> <title>書き換え前</title> </head> <body> </body> </html> |
CasperJSスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
"use strict"; var casper = require('casper').create({ verbose: true, logLevel: 'debug' }); casper.start('http://test/index.html', function() { this.echo(this.getTitle()); }); casper.run(function() { this.exit(); }); |
CasperJSをPhantomJS、SlimerJSで実行すると以下の通り、いずれも”書き換え後”が取り出せていて、JavaScriptによる処理が拾えています。
処理時間は、SlimerJSはPhantomJSの3倍近くかかっていて、GUIブラウザを使う分かなり遅いです。
1 2 3 4 5 6 7 8 9 10 11 |
$ casperjs --engine=phantomjs scraper.js [info] [phantom] Starting... [info] [phantom] Running suite: 2 steps [debug] [phantom] opening url: http://test/index.html, HTTP GET [debug] [phantom] Navigation requested: url=http://test/index.html, type=Other, willNavigate=true, isMainFrame=true [debug] [phantom] url changed to "http://test/index.html" [debug] [phantom] Successfully injected Casper client-side utilities [info] [phantom] Step anonymous 2/2 http://test/index.html (HTTP 200) 書き換え後 [info] [phantom] Step anonymous 2/2: done in 227ms. [info] [phantom] Done 2 steps in 244ms |
1 2 3 4 5 6 7 8 9 10 11 |
$ casperjs --engine=slimerjs scraper.js [info] [phantom] Starting... [info] [phantom] Running suite: 2 steps [debug] [phantom] opening url: http://test/index.html, HTTP GET [debug] [phantom] Navigation requested: url=http://test/index.html, type=Undefined, willNavigate=true, isMainFrame=true [debug] [phantom] url changed to "http://test/index.html" [debug] [phantom] Successfully injected Casper client-side utilities [info] [phantom] Step anonymous 2/2 http://test/index.html (HTTP 200) 書き換え後 [info] [phantom] Step anonymous 2/2: done in 683ms. [info] [phantom] Done 2 steps in 696ms |