wshとjscriptでhtmlのtableをスクレイピングするサンプルコード

webスクレイピングのプログラミング言語にはいろいろ選択肢あるが

以前、当ブログにて、Webスクレピングを行う際のプログラミング言語比較を行いました。
http://buki.tech/webscraping-language/

一長一短ではあるのですが、どの言語を選んだとしても、ある程度の環境構築が必要となります。

インストールとか設定とか面倒ですよね?!

また、他人のPCとか漫画喫茶のPCとか、インストールしづらいものもあると思います。

そんなとき、windowsであれば、wshとjscriptの環境がお勧めです!

wsh+jscriptでwebスクレイピングするメリット

  • インストール不要
  • ダブルクリックで実行可能
  • jscriptなんでjavascriptのライブラリなどを活用可能

ライブラリといっても、jqueryやnodeを使うとすると、インストール必要になってしまいます。しかし、ものによっては、スタンドアロンのjsファイルが配布されております。

ファイルごとgoogleドライブかどこかにぶっこんでおけば、それをDLするだけで実行可能です。

あくまでも、インストールやレジストリ書込みが不要という意味合いです。

デメリットは敢えて言いませんよ(笑)

竹槍で戦うしか無い状況だったら竹槍で戦う方法を考えましょう!ということです。

サンプルコード

解説は控えます(笑)

簡単に実行出来てしまう上、リスクが高いので解説は控えます。

書き方的には、IEとVBAでWebスクレイピングをするのに似ています。

JscriptではなくVBSで書けば、ほぼ同じコードで行けます。

僕は、後々のことを考えてJscriptにしました。JscriptとVBSの併用も出来るようですよ!

対象サイト

僕は、ダーツをやっているのですが、ソフトダーツのプロツアーのポイントランキングをスクレイピングしてみました。

悪用厳禁ですよ!

http://www.prodarts.jp/

urlのパラメータ

例えば、

2017年度の男子のポイントランキングの1ページ目の場合は、以下のようになります。

http://member.prodarts.jp/players_ranking.php?tournament_year=2017&mem_sex_cd=2&word=&start=1
  • tournament_year=年度
  • mem_sex_cd=性別※男子が1,女子が2
  • start=ページ

のようです。

wsh

html+xmlのようなイメージです。
ファイル名は何でもいいですが、拡張子はwsfです。jsでは面倒な外部ファイルのインクルードが簡単に出来ます。
というか、そこくらいしか褒めるところが無いw

<script language="JScript" src=".\lib\scrapehtml.js"></script>
  <script language="JScript">
   var url = getUrlPointRanking(2,2017,1);
   var str = scrapeTable(url,',');

   WScript.Echo(str);
</script>

jscript

function scrapeTable(arg_url,sep){
  var ie = new ActiveXObject("InternetExplorer.Application");

  ie.Visible = true;
  ie.Navigate(arg_url);

  while( (ie.Busy) || (ie.readystate != 4) ) {
    WScript.Sleep(100);
  }

  var rt_str = '';
  var tbl = ie.document.getElementsByTagName("table").item(0);
  var rows = tbl.rows;

  for (var i=1, len=rows.length; i<len; i++) {
    var cols = rows[i].cells.length;
    for (var j=0; j<cols; j++) {
      if((rows[i].cells[j].innerText.length) != 0){
      rt_str += rows[i].cells[j].innerText;
      rt_str += sep;
      }
    }
    rt_str += ('\n');
  }
  
  ie.Quit();
  fs = null;
  ie = null;
  
  return rt_str;
}

function getUrlPointRanking(sex,year,page){
  var ret_url = ''
  var base_url = "http://member.prodarts.jp/players_ranking.php";
  
  ret_url = base_url + '?tournament_year=' + year;
  ret_url = ret_url + '&mem_sex_cd=' + sex;
  ret_url = ret_url + '&word=&start=' + page;
  return ret_url;
}

コメント