「Raspberry Pi 3へスクレイピングソフト「CasperJS」のインストール 」でRaspberry Pi 3にCasperJSをインストールしました。ここでは、CasperJSを使ったスクレイピング を行います。
CSSで作成されたボタンのクリック
このブログのトップページには、CSSにより作成した次のような「お問い合わせ」ボタンが設置されています。お問い合わせボタンは、次のようにCSSコードで作成されており、クリックすると問い合わせページに飛びます。
トップページに埋め込まれたボタンは次のように表示されます。
このボタンのCSSコードを次に示します。
<a href="https://tomosoft.jp/design/?page_id=2305" target="_self" class=" button white large" rel="slides[buttonlightbox]">お問い合わせ</a>
スクレイピングのスクリプトは次のようになります。CSS セレクタをパラメータにしたclickメソッドを使います。クリックしても次のページがすぐに表示されないので、waitメソッドで、クリック後10秒待たせています。
button.js
var fs = require('fs');
var casper = require('casper').create();
casper.start('https://tomosoft.jp/design/', function() {
this.echo(this.getTitle());
});
casper.then(function(){
this.click('.button');
});
casper.then(function(){
this.wait(10000, function() {
this.echo("wait...");
});
});
casper.then(function(){
this.echo(this.getTitle());
var html = this.getHTML();
var f = fs.open('jepx', 'w');
f.write(html);
f.close();
});
casper.run();
作成したbutton.jsをcasperjsで実行します。次のような結果になりトップページから問い合わせページに移動したことがわかります。
# casperjs button.j.js ネットワークソフトウェア開発|TomoSoft wait… お問い合わせ | TomoSoft
ブラウザ「Firefox」でのCSS セレクタの取得方法
複雑なサイトの自動化を試みる場合、clickメソッド等で使用するCSSセレクタを取得するために、Firefoxのインスペクタを利用します。次の手順でCSSセレクタを取得します。
- メニュー「ツール」→「Web開発」→「インスペクタ」により、インスペクタ画面を表示します。
- 今回クリックするボタンを表示し、ページのボタンを選択すると、Htmlソースコードの対応する部分が反転表示されます。
- 右クリックしてメニューを表示し、「一意なセレクタをコピー」をクリックすると、選択されたボタンのCSSセレクタがコピーされます。
FirefoxのインスペクタによるCSSセレクタのコピー画面を次に示します。
次の内容がコピーされます。
.button
ブログ一覧の取得
スクレイピングのスクリプトは次のようになります。getElementsAttributeメソッドで、ブログのリンクを取得します。casper.emitメソッドによりpage_accessイベントを発生し、casper.onでpage_accessイベントを受け取り、ここで、openメソッドで先に取得したブログのリンクを開き、getTitleメソッドでページのタイトルを取得します。
bloglist.js
var fs = require('fs');
var casper = require('casper').create();
var AnchorArrays = [];
var page_num_index = 0;
var NextLink = [];
//★★★カスタムイベント★★★
casper.on('page_access', function(){
//アクセスするページのURLを取得済みのリンク一覧配列から取り出す
var access_page_url = AnchorArrays[page_num_index];
this.echo('casper.on: ' + access_page_url);
//ブログのN番目に遷移
this.open(access_page_url).then(function() {
//画面のタイトルを表示
this.echo(this.getTitle());
page_num_index++;
//ブログのリンク一覧数分繰り返す
if(page_num_index<AnchorArrays.length){
//カスタムイベントpage_accessを発行する
casper.emit('page_access');
}
});
});
casper.start('https://tomosoft.jp/design/?page_id=2302', function() {
//ブログのリンク一覧を取得(配列として取得)
AnchorArrays = this.getElementsAttribute('#content > div.post.clearfix > div.post-content > div.post-title> h2 > a', 'href');
//カスタムイベントを発行してブログのページに遷移する
if(AnchorArrays.length > 0){
//カスタムイベントpage_accessを発行する
casper.emit('page_access');
}
});
casper.run();
作成したbloglist.jsをcasperjsで実行します。次のような結果になり、ブログの一覧の最初のページが取得できたことがわかります。
# casperjs bloglist.js casper.on: https://tomosoft.jp/design/?p=7715 Arduino Uno R3を使ってATmega328Pにブートローダの書き込み | TomoSoft casper.on: https://tomosoft.jp/design/?p=7642 Highchartsを使用した環境データの表示 | TomoSoft casper.on: https://tomosoft.jp/design/?p=7598 IFTTTを用いてESP-WROOM-02からGoogleドライブ・スプレッドシートに書き込み | TomoSoft casper.on: https://tomosoft.jp/design/?p=7583 UnityでAndroidのセンサ情報の取得 | TomoSoft casper.on: https://tomosoft.jp/design/?p=7554 TRIAL-ESP8266-LEAFキットでWi-Fi接続 | TomoSoft casper.on: https://tomosoft.jp/design/?p=7541 Unity で Bundle Identifier の設定とアンドロイド端末での実行 | TomoSoft casper.on: https://tomosoft.jp/design/?p=7525 Node.jsバージョン6 をUbuntu 14.04 LTSにインストール | TomoSoft casper.on: https://tomosoft.jp/design/?p=7490 Raspberry Pi 3でCasperJSによるスクレイピング | TomoSoft casper.on: https://tomosoft.jp/design/?p=7476 Raspberry Pi 3にOpenCV 3.1のインストール | TomoSoft casper.on: https://tomosoft.jp/design/?p=7453 Raspberry Pi 3へスクレイピングソフト「CasperJS」のインストール | TomoSoft
Nextボタンによる次ページの表示
ブログ一覧の最後に次のボタンが並んでおり、次のブログ一覧のページが選択できるようになっています。
並んでいるボタンのhtmlコードは次のようになっています。
<div id="pagination" class="clearfix"> <span class="allpages">Page 1 of 14</span> <span class="current">1</span> <a href="https://tomosoft.jp/design/?page_id=2302&paged=2" class="inactive">2</a> <a href="https://tomosoft.jp/design/?page_id=2302&paged=3" class="inactive">3</a> <a href="https://tomosoft.jp/design/?page_id=2302&paged=4" class="inactive">4</a> <a href="https://tomosoft.jp/design/?page_id=2302&paged=5" class="inactive">5</a> <a href="https://tomosoft.jp/design/?page_id=2302&paged=2">Next ›</a> <a href="https://tomosoft.jp/design/?page_id=2302&paged=14">Last »</a> </div>
スクレイピングのスクリプトは次のようになります。getElementsAttributeメソッドによりボタンのリンク先の一覧を取得します。cssセレクタではなくラベルを使って、ボタンをクリックします。この場合、ラベル「Next ›」としてclickLabelメソッドを呼び出します。
nextbutton.js
var fs = require('fs');
var casper = require('casper').create();
var AnchorArrays = [];
casper.start('https://tomosoft.jp/design/?page_id=2302', function() {
this.echo(this.getTitle());
//ブログ一覧ページを取得(配列として取得)
AnchorArrays = this.getElementsAttribute('#pagination > a', 'href');
require('utils').dump(AnchorArrays);
});
casper.then(function(){
this.clickLabel('Next ›', 'a');
});
casper.then(function(){
this.wait(10000, function() {
this.echo("wait...");
});
});
casper.then(function(){
this.echo(this.getTitle());
});
casper.run();
作成したnextbutton.jsをcasperjsで実行します。次のような結果になり、各ボタンのリンク先の一覧が表示され、「ブログ | TomoSoft – Part 2」の表示により、ブログの一覧の次のページに移動したことがわかります。
# casperjs nextbutton.js
ブログ | TomoSoft
[
"https://tomosoft.jp/design/?page_id=2302&paged=2",
"https://tomosoft.jp/design/?page_id=2302&paged=3",
"https://tomosoft.jp/design/?page_id=2302&paged=4",
"https://tomosoft.jp/design/?page_id=2302&paged=5",
"https://tomosoft.jp/design/?page_id=2302&paged=2",
"https://tomosoft.jp/design/?page_id=2302&paged=14"
]
wait...
ブログ | TomoSoft - Part 2


