JavaScriptでスクレイピングしたい!
JavaScriptというか、JQueryですね。どちらかと言うと。
WebサイトやWebアプリを作っていたりすると、たまーにスクレイピングしたい時ってありますよね。
「他所のサイトからちょっとデータを拝借して・・・」って時、APIが提供されていればいいんですが、そうじゃない場合、PHPとかでスクレイピングしようとすると、一気にめんどくさくなります。
JQueryをワードプレスで動かす方法に関する記事はこちら。
色々使ってみた結果、DOM操作の至上はやはりJQueryである
もちろんPHPでも出来るんですが、「そこまで必死にならなくていいし。」みたいなかるーいクローリングの場合サクッとJQueryでスクレイピング出来ないのか?とか、考えたことはありませんか?
僕自身スクレイピングは割と多様する技術の一つで、色んな言語の色んなライブラリを使ってきましたが、DOM操作という点において、もっとも優れているのはJQueryであり今のところ右に出る言語も、特定のライブラリもありません。
JavaScriptってスクレイピング出来るの?
結論から言うと、できません。何を持ってして「スクレイピング」と呼ぶのかという、細かいところはありますが、とりあえずJavaScriptだけでスクレイピングを完結させることは不可能です。
クロスドメイン制約
という、取り決めがJavaScriptには存在しており、ドメインを跨いだデータのリスエストを受け付けません。
HTTPリクエストだけ、他でやる
これが唯一無二の解答であります。
結局、何でJavaScriptでスクレイピングやりたいかって言うと、上でも述べた通り、JQueryによるDOM操作が楽だからなんですよね。
他ってのは、何の言語でも問題ないです。サーバーサイドで動きさえすれば。
この記事内ではPHPを使って実装してみます。
JavaScriptでのスクレイピング実装
実際、JSとPHPのコンビネーションによるサンプルを書いていきます。
ここではクエリストリングとして受け取ったURLにアクセスして、当該URLのページタイトルの取得を目指します。
PHPでターゲットURLにアクセス
まずはPHP側ですが、非常に単純です。
<?php $html = file_get_contents($_GET['url']); echo $html;
これだけ。
ファイル名は[mirror.php]として、FTPでサーバーにアップロードして、PHP側の準備は完了。
アップロードしたURLが仮に”https://lets-hack.tech/wp-content/php/mirror.php “だった場合、パラメータとして”?url=http://exemple.com”を付加してアクセスすると、そのurlにアクセスして、htmlをそのまま返します。
こんな感じ↓
https://lets-hack.tech/wp-content/php/mirror.php?url=https://yahoo.co.jp
phpのfile_get_contents関数を経由することによって、JavaScriptのクロスドメインの制約を回避して、自サイト内でスクレイピングを完結できる構造になるワケです。
JQueryでajaxでデータを取得
var target = $('#target').val() $.ajax({ url: `/wp-content/php/mirror.php?url=${target}`, type: 'GET', dataType: 'html', cache: false }).done(function(data) { console.log("ok"); $('#result').html($(data).find('h2').text()); }).fail(function(XMLHttpRequest, textStatus, errorThrown) { console.log("error"); })
ワードプレスサイトの任意の位置に先ほどの[mirror.php]をアップロード。
そこにアクセスして帰ってきた[data]をJQueryでいじっていきます。
上記例ではtargetという変数にスクレイピングしたいURLを格納して使うことになります。
実際にJQueryによるスクレイピングの形を作ってみる
任意のURLを入力すると、そのサイトのH1タグを取得します。
フロントエンド側の実際のソースコード
<div class="search-box"> <input id="target" class="target" type="text" placeholder="任意のURLを入力" value="" name="kw"> <button class="btn-search"> <img src="https://lets-hack.tech/wp-content/themes/keni80_wp_standard_all/images/icon/search_black.svg" width="18" height="18"> <noscript> <img src="https://lets-hack.tech/wp-content/themes/keni80_wp_standard_all/images/icon/search_black.svg" width="18" height="18"> </noscript> </button> </div>
var main = function(){ var target = $('#target').val() $('#result').html('<img class="loading" src="/wp-content/themes/keni8-child/images/loading.svg">') $.ajax({ url: `/wp-content/php/mirror.php?url=${target}`, type: 'GET', dataType: 'html', cache: false }).done(function(data) { console.log("ok"); $('#result').html($(data).find('h1').text()); }).fail(function(XMLHttpRequest, textStatus, errorThrown) { console.log("error"); }) } $('.btn-search').on('click',main); $( '#target' ).keypress( function ( e ) { if ( e.which == 13 ) { console.log("key" + e.which); main(); return false; }; });
ワードプレスで動かす場合はwindow.onloadやjQuery(function ($) {})などでのカプセル化が必要です。
ajax.done内の[data]変数のいじり方でどんな値でも取得することができます。
JQueryによるスクレイピング完成系
まとめ
JQueryはDOM操作で一番便利なのは普及度合いを見ても明らかです。
スクレイピングにJQueryを利用できるのは便利さアップです。
コメント