まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

Node.js でのスクレイピングに挑戦したことがなかったのでやってみました。

一般的にスクレイピングでは http でコンテンツ文字列を取得して、正規表現などを用いて取得したコンテンツ文字列から指定のパターンに合致する箇所のテキストを取得します。今回はその部分を手でガリガリ、、ではなく、この cheerio-httpcli モジュールを使ってスクレイピングに挑戦しました:
https://www.npmjs.com/package/cheerio-httpcli

2017072600


まずはこの cheerio-httpcli モジュールを npm でインストールします:
$ npm install cheerio-httpcli

Node.js のコード内で cheerio-httpcli モジュールを利用する場合は以下のような記述を行います:
var client = require( 'cheerio-httpcli' );
 :

var url = 'https://www.google.com/finance/converter?a=1&from=EUR&to=JPY';
client.fetch( url, {}, function( err, $, res ){
  $('.bld').each( function(){
    text = $(this).text;
       :
  });
});


実はこれだけでテキストのフェッチとスクレイピングの両方が実現できてしまっています。URL を指定してその HTML テキストをフェッチします。その結果は $ に入るので、フェッチの結果は jQuery の DOM のように扱うことができます。上例では取得した HTML テキスト内において bld クラスを適用した要素内のテキスト(<xxx class="bld">XXXXX</xxx> となっている箇所の XXXXX 部分)を取得して、変数 text に代入しています。

上記のサンプルで紹介している URL: https://www.google.com/finance/converter?a=1&from=EUR&to=JPY はグーグルの通貨変換ページです(このパラメータの場合、ユーロ(EUR)から日本円(JPY)への変換レートを取得します)。この URL にアクセスすると、以下のような HTML が返って来ます:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  :
  :
</div>
 
<div id=currency_converter_result>1 EUR = <span class=bld>130.0360 JPY</span>
<input type=submit value="Convert">
</div>
<input type=hidden name=meta value=ei=E1N4WYisKN6O0QS8v4OoBA>
</form>
</body>
</div>
</html>

このようにレート変換した結果は上記赤字部分になるので、ここを取得できればよいことになります。したがって上述のように bld クラスを指定した箇所のテキスト値をスクレイピングすれば(上記の場合であれば "130.0360 JPY" という文字列が)変数 text に代入できる、ということになります。

jQuery スタイルで使えるのがとっても便利!


オラクルが、正規ライセンス購入前の勉強目的で試しにソフトウェアを利用することのできるライセンス『OTN(Oracle Technology Network)開発者ライセンス』を提供していることを今更ながら知りました:
自分用Oracle DBを「無償で」作ろう!「OTN開発者ライセンス」

※同じく無料版である IBM Db2 Express-C みたいな位置付け?と思っていたのですが、ちと違いそう。Express-C は機能としては Express Edition に近いのですが、開発者エディションというわけではありません。「サポートなしで本番利用可」なのが IBM Db2 Express-C であり、この辺りが違いと言えそうです。

※むしろ IBM Db2 Developer Community Edition の位置付けが近い感じ。


利用するには Oracle アカウントの登録が必要ですが、登録自体は無料でした。各種オラクル製品がダウンロード可能で、オラクルDBはもちろん、Java や MySQL などの製品版も対象に含まれていました。利用目的は制限されていますが、仕様、検証、開発、テストに使うことはできるとのこと。早速使ってみました。なんと 20年以上ぶりにオラクル DB をインストールしてみた顛末です(笑)。


まずは OTN ページにアクセスして "Sign In" します:
2017072101


自分の OTN ID とパスワードを指定して「サインイン」します:
2017072102


サインイン後、"Software Downloads" をクリックしてダウンロードページに移動します:
20170721025


ダウンロードページをスクロールすると、ダウンロード対象の製品一覧が見つかります。オラクルDBも新しいエディションである 12c の Enterprise/Standard Edition 含めてダウンロードできますが、自分は比較的軽量な方がいいので 11g の Express Edition を選択しました:
2017072103


オラクルDB Express 11g2 のダウンロードページです。License Agreement にチェックを入れます:
2017072104


そして対象プラットフォーム(下図は Linux x64 を選択。他に Windows 32/64 bit 版を選択可)を選ぶとダウンロードが開始されます:
2017072105


ダウンロードできれば後はインストールするだけですが、Linux 版のオラクルDB Express 11g2 の場合、インストールするには スワップメモリが 2GB 必要です(足りないとインストーラーが止まります)。充分なスワップメモリが確保されていない環境の場合は動的にスワップファイルを増やす必要があります。その方法や手順は以下を参照ください:
Linux の SWAP 領域を増やす


改めて Linux 版の場合は zip された rpm ファイルがダウンロードされます。なので 64bit Linux 上でダウンロードしたファイルを unzip し、Disk1 フォルダ以下にある rpm ファイルを指定してインストールします:
# unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
# cd Disk1
# rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm
準備中...                ########################################### [100%]
   1:oracle-xe              ########################################### [100%]
Executing post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.


「root で /etc/init.d/oracle-xe configure を実行しろ」というメッセージが表示されているので、このコマンドを実行して初期セットアップを実行します。セットアップ時の選択肢は全てデフォルトのままで、明示的に指定したのはパスワード(と確認パスワード)だけです:
# /etc/init.d/oracle-xe configure

Oracle Database 11g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 11g Express
Edition.  The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts.  Press <enter> to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:

Specify a port that will be used for the database listener [1521]:

Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of
different passwords for each database account.  This can be done after
initial configuration: (パスワード指定)
Confirm the password: (確認パスワード指定)

Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:

Starting Oracle Net Listener...Done
Configuring database...Done
Starting Oracle Database 11g Express Edition instance...Done
Installation completed successfully.


これでセットアップ完了、、のはず、ですが、この後の作業を便利に行うための追加作業をしておきます。オラクル DB をコマンドラインから操作する場合に便利な環境変数が /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh(および /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.csh)コマンドによって設定されます。なので、/etc/bashrc などに以下の1行を追加して、対象ユーザーがログインする際にこの環境変数設定が行われるようにしておきます:
. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

改めてログインし直して(この環境変数設定を有効にして)、SQL*Plus を実行し、system DB に対して SQL を実行してみます:
# sqlplus system

SQL*Plus: Release 11.2.0.2.0 Production on 土 7月 22 01:54:50 2017

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

パスワードを入力してください:


Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

SQL>

動きましたー! 懐かしい(Solaris の前の)SunOS 以来のオラクル DB インストール体験でした。いやあ、再びオラクルをインストールする日が来るとは・・・

Linux を使っている時に、ディスクの余った領域を SWAP ファイルとして作成し、SWAP 領域を増やす手順です。OS を起動したまま、サービスを止めることなく変更します。


まず増やす前の状態を確認しておきます:
# free -m
             total       used       free     shared    buffers     cached
Mem:           996        918         77          3          3        586
-/+ buffers/cache:        328        667
Swap:         1023          1       1022

現在のスワップは約 1GB(1023 MB)になっています。この領域を 1024 MB 増やして、約 2GB にします。

方法としては /var/swapfile という 1GB のファイルを作り、このファイルをスワップとして利用します:
# dd if=/dev/zero of=/var/swapfile bs=1M count=1024
# mkswap /var/swapfile
# swapon /var/swapfile

ここまでの作業が出来たら改めて状態を確認します:
# free -m
             total       used       free     shared    buffers     cached
Mem:           996        918         77          3          3        586
-/+ buffers/cache:        328        667
Swap:         2047          1       2046

SWAP メモリが約 2GB に増えました。なお、このまま元の状態(SWAP メモリ 1GB)に戻す場合は swapoff コマンドを利用します:
# swapoff /var/swapfile

このままだと次回起動時には SWAP メモリは 1GB に戻ります。次回起動時以降は SWAP メモリ 2GB の状態で起動させたい場合は、以下のコマンドを実行して /etc/fstab ファイルを書き換えます:
# echo "/var/swapfile        swap                    swap    defaults        0 0" >> /etc/fstab

 

このページのトップヘ