Node.js(JavaScript)によるWebスクレイピング入門

スクレイピング, Jan-0820225分で読める

新しいテクノロジーを活用する方法をお探しですか?ウェブ抽出またはウェブスクレイピングは、構造化されたウェブデータを自動化された方法で収集する方法を提供します。例えば、ウェブスクレイピングはEコマースの世界で競合他社のサービスや製品の価格を監視するために使用されています。ウェブスクレイピングのその他の使用例

目次

新しいテクノロジーを活用する方法をお探しですか?ウェブ抽出またはウェブスクレイピングは、構造化されたウェブデータを自動化された方法で収集する方法を提供します。例えば、ウェブスクレイピングはEコマースの世界で競合他社のサービスや製品の価格を監視するために使用されています。ウェブスクレイピングのその他の使用例を以下に示します。

  • ソーシャルメディア・サイトでトレンド・データを見つける
  • 他のウェブサイトからデータを収集し、自分のウェブサイトで使用する。
  • 公開されている電子メールを公開しているウェブサイトから電子メールアドレスを抽出する
  • オンライン・ストアの商品画像や販売データのスクレイピング

Node.jsを使ったウェブスクレイピングの方法を学びます。その前に、Node.jsとは何かを見てみましょう。Node.jsはオープンソースのサーバーサイドプラットフォームで、サーバーサイドやネットワーキングのアプリケーションを開発することができる。Node.jsのアプリケーションはデータをバッファリングしないため、ライブラリのコード実行は非常に速い。単にデータをチャンクで出力するだけだ。以下に、Node.jsを使用できる分野をいくつか示します。

  • データ・ストリーミング・アプリケーション
  • シングル・ページ・アプリケーション
  • 入出力バウンド・アプリケーション
  • データ集約型リアルタイム・アプリケーション

なぜウェブスクレイピングにNode.jsを使うのか?

ウェブスクレイピングにNode.jsを使う理由は以下の通りです。

習得が簡単 - Javascriptは、フロントエンド開発者がよく使うプログラミング言語だ。Node.jsはシンプルなJavascriptであるため、バックエンド開発者はすぐにNode.jsを習得して使用することができる。そのため、Node.jsを学ぶために特別な努力をする必要はない。

単一のプログラミング言語 - Node.jsを使ってJavascriptでサーバーサイド・アプリケーションを書くことができる。つまり、Node.jsの開発者は、Javascriptを使ってフロントエンドとバックエンドの両方のWebアプリケーションを書きます。他のサーバーサイドプログラミング言語を使用する必要はありません。ほとんどのウェブブラウザがJavascriptをサポートしているため、ウェブアプリケーションを簡単にデプロイすることができる。 

スケーラビリティ - Node.jsの開発者は、アプリケーションを水平方向にも垂直方向にも簡単にスケールできる。既存のシステムにノードを追加して、アプリケーションを水平方向に拡張できます。単一ノードにリソースを追加することで、アプリケーションを垂直方向に拡張できます。 

高性能 - Node.jsは、GoogleのV8 Javascriptエンジンを使用して、Javascriptコードを直接マシンコードにコンパイルしながら解釈します。そのため、このエンジンを使って効率的にコードを実装することができます。 

キャッシュ - 開発者は、Node.jsのオープンソースの実行環境を使用して、単一のモジュールをキャッシュすることもできる。キャッシュによって、アプリケーションはウェブページをより速くロードできるようになり、開発者はコードを再利用する必要がなくなる。   

Node.jsを使ったウェブスクレイピング

Node.jsを使ったウェブ・スクレイピングには、以下の2つのnpm モジュールを使う。

cheerio -ウェブサイトからデータを抽出するために使用されるJavascriptの技術です。DOM要素の選択、編集、閲覧に役立ちます。

request-promise - シンプルなHTTPクライアントで、素早く簡単にHTTPコールを行うことができます。

プロジェクト設定

新しいプロジェクト・フォルダーを作成する必要があります。そのフォルダー内にindex.jsファイルを作成する。それから、依存関係をインストールしなければならない。そのためには、コマンドラインを開き、以下のコマンドを入力する。 

npm install --saverequest request-promise cheerio

以下のコードを使って、index.jsファイルでrequest-promiseと cheerioをrequireする必要がある。

const rp= require('request-promise');
const cheerio= require('cheerio');

セットリクエスト

request-promiseがPromiseをサポートしたクライアントの「リクエスト」であることはご存じだろう。つまり、入力としてオブジェクトを受け取り、プロミスを返します。 

const options = {
 uri: `https://www.yourURLhere.com`,
 transform: function (body) {
   return cheerio.load(body);
 }
};

上記のコードでは、オプション・ オブジェクトは2つのことをしなければならない。

  • URLを渡してスクレイピングする。
  • 返されたHTMLをcheerioを使って読み込む。

コード内のuriキーは、スクレイピングしたいウェブサイトである。

transform キーは、返されたボディを我々に返す前に、request-promiseを使ってcheerioにロードする。

リクエスト

以下のコードを使用してリクエストすることができます。

rp(OPTIONS)
   .then(function (data) {
       // REQUEST SUCCEEDED: DO SOMETHING
   })
   .catch(function (err) {
       // REQUEST FAILED: ERROR OF SOME KIND
   });

上のコードでは、optionsオブジェクトをrequest-promiseに渡している。そして、リクエストが成功するか失敗するかを待ちます。 

ここで、以下のようにアロー関数を使用した独自のバージョンのコードを作成する。

rp(options)
 .then(($) => {
   console.log($);
 })
 .catch((err) => {
   console.log(err);
 });

プレースホルダーのuriを スクレイピングしたいウェブサイトに置き換えてください。コンソールを開き、index.jsファイルに次のように入力する。

{ [Function: initialize]
 fn:
  initialize {
    constructor: [Circular],
    _originalRoot:
     { type: 'root',
       name: 'root',
       namespace: 'http://www.w3.org/1999/xhtml',
       attribs: {},
       ...

これがNode.jsを使って最初のスクレイピングを行う方法です。以下は、私たちがこれまでに行った全コードです。

const rp = require('request-promise');
const cheerio = require('cheerio');
const options = {
  uri: `https://www.google.com`,
  transform: function (body) {
    return cheerio.load(body);
  }
};

rp(options)
  .then(($) => {
    console.log($);
  })
  .catch((err) => {
    console.log(err);
  });

データを活用する

cheerioを使って欲しいデータを抽出することができます。cheerioのセレクタの実装はjQueryのそれとほぼ同じです。セレクタメソッドはドキュメント内の要素をトラバースして選択するために使用できます。また、データの取得や設定にも使えます。例えば、以下のようなウェブサイトのHTMLをスクレイピングしたいとします。

 id="cities">
 class ="large">ヨーロッパ> id ="medium">トルコli> class ="small">セーラムli

idを選択するには「#」、クラスを選択するには「.以下のように、タグ名で要素を選択することができます。

$('.large').text()
// ヨーロッパ
$('#medium').text()
// トルコ
$('li[class=small]').html()

each()関数を使えば、複数の要素を繰り返し処理できます。リスト・アイテムの内部テキストを返すには、上で示したのと同じHTMLコードを使用します。

$('li').each(function(i, elem) {
 cities[i] = $(this).text();
});

これが、Node.jsを使ってウェブサイトからデータをスクレイピングする方法です。また、リストの子要素やウェブサイトのHTMLのデータを抽出するために、追加のメソッドを使用することもできます。

プロキシでNode.jsを使うことの重要性

プロキシは、リソースを要求するクライアントと、リソースを提供するサーバーとの仲介役として機能することはご存じだろう。プロキシには以下の3種類があります。

レジデンシャル・プロキシ - このプロキシは、ローカルのインターネット・サービス・プロバイダー(ISP)からのIPアドレスを含んでいるため、ターゲットのウェブサイトは、ウェブサイトを閲覧しているのが実在の人物なのかスクレイパーなのかを判断することができない。 

データセンタープロキシ - このタイプのプロキシはクラウドサービスプロバイダーによるもので、家庭用プロキシよりも安価なため、多くの人に利用されている。

モバイルプロキシ - モバイルプロキシは、プライベートなモバイルデバイスのIPであり、家庭用プロキシと同様に機能する。モバイルネットワーク事業者によって提供され、非常に高価です。 

Pythonのrequests モジュールを使えば、Webスクレイピングにプロキシを使うことができる。まず、requestsモジュールをインポートします。それから、プロキシのプールを作って、それを繰り返し実行します。以下のように、requests.get()を使って、プロキシを URL のパラメータとして渡してGETリクエストを送ることができます。

import requests
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
# Sending a GET request to the url and
# passing the proxy as a parameter.
page = requests.get(url,
                   proxies={"http": proxy, "https": proxy})
 # Printing the content of the requested url.
print(page.text)

以下の出力が得られる。

Node.jsを使ったウェブスクレイピングの結論

これまで、Webスクレイピングと呼ばれる自動化された方法を使用して、Webサイトから構造化データを抽出できることを説明した。様々な言語を使ってウェブサイトをスクレイピングすることができるが、今回はNode.jsを使ってウェブサイトからデータを収集する方法を学んだ。やるべきことは、プロジェクトフォルダのindex.jsファイルにコードを追加するだけだ。プロジェクトをセットアップした後、データを抽出するためのリクエストを設定し、実行することができる。さらに、そのデータを様々な目的で使用することができる。ウェブサイトをスクレイピングするのが安全でないことはご存じだろう。そのため、目的のウェブサイトからデータを収集するには、プロキシを使用する必要があります。あなたは、住宅や データセンターのプロキシを使用することができますが、それは彼らが速く、簡単に検出することはできませんので、住宅プロキシを使用することをお勧めします。