MENU

【JavaScript】Webスクレイピングのやり方と注意するべきことまとめ

2019 10/12
【JavaScript】Webスクレイピングのやり方と注意するべきことまとめ

スクレイピングとは、webサイトのデータを取得する方法の一つです。

スクレイピングをすることによって、Amazonの特定ジャンルの「商品名」「価格」「在庫状況」などを一括で取得することができます。

しかし、スクレイピングはデータを取得する方法としては、非常にグレーな方法のため、もし実施するとなった場合にも注意が必要です。

そこで今回は、Webスクレイピングをするにあたって、やり方と注意点について解説していきます。

目次

Webスクレイピングをする前に確認するべきこと

まず、スクレイピングにおいて確認すべき点は以下の3点です。

  • スクレイピング先のサーバーに大きな負荷をかけないか?
  • 取得データの使い方には法律に違反しないか?
  • 取得先のサイトはAPIを提供していないか?

サーバーに大きな負荷をかけていないか

まず、1つ目の理由としてはスクレイピング先のサーバーに大きな負荷をかける可能性があることです。

おそらく、スクレイピングをするにあたって、1ページだけデータを取れたら満足!というケースは少ないでしょう。

実際に特定のサイトをスクレイピングしようとなった場合には、

  • 特定のカテゴリ情報全て
  • webページ全て

など、webサイトのあらゆるページをアクセスすることによって、情報を取得することになるでしょう。

しかし、例えば特定のカテゴリ情報を全て取得しようと考えると、そのカテゴリページ分だけリクエストを投げることになります。

具体的には以下のようなコードになるでしょう。

i = 0;
while (1) {
  const url = `https://example.com?category_id=2&page=${i}`;
  const response = await request(url);

  // responseをどうにかする処理

  i++;
  if (response.status != 200) {
    break;
  }
}

このように、特定のカテゴリページでエラーが表示されるまでループすることになりますが、これは短期間に大量のリクエストを送ることになります。

もちろん、通常に使用する分でこれだけリクエストが来ることは、あり得ないので攻撃と見なされる可能性が高くなります。

したがって、リクエストとリクエストを送る間隔は setTimeout などで、短時間にリクエストを送らないように注意しましょう。

取得データの使い方には法律に違反しないか?

スクレイピングの情報を取得して自社のサーバーなどにデータを保存した場合、法律違反になる可能性が高いです。

なぜなら、webサイトで公開しているデータが著作物としてオリジナリティが認められる可能性は高く、著作権違法に触れることになるためです。

筆者は法律の専門家ではないため、詳しい解説については以下のサイトに任せることにしますが、スクレイピングは法律違反にもなりうることを知っておく必要があるでしょう。

スクレイピングは違法?3つの法律問題と対応策を弁護士が5分で解説

取得先のwebサイトがAPIを提供していないか

最後に、スクレイピングをする前にスクレイピングをしようと考えているwebサイトが公式でAPIを提供していないかは必ず確認しておきましょう。

もし、APIを提供しているのであれば、わざわざグレーなスクレイピングする理由もないですしAPIを利用した方が確実に求めるデータを取得することができます。

事前にAPIが提供されていないか?は必ず確認するようにしましょう。

JavaScript(Node.js) で実行するWebスクレイピングのやり方(概要)

スクレイピングのやり方としては、それほど難しいものではありません。

スクレイピングの手順はざっくり以下の通りです。

  1. スクレイピングするページのURLを探す
  2. 次のページにアクセスする(クローリングする)方法を探す
  3. 対象データを取得する方法を調べる

スクレイピングするページのURLを探す

まず、対象のスクレイピングするサイトを決めます。

ここでは、一例としてAmazonのPrime Videoをスクレイピングすることを考えてみましょう。

Amazon Prime Videoは以下のURLになります。このURLを使って行きます。

あわせて読みたい
Amazon.co.jp
カタカナ&ref=nb_sb_noss

次のページにアクセスする方法を探す

次のページにアクセスする方法をAmazonのページから探してみると以下のようなリンクを発見しました。

出典: Amazon

ここのリンクのURLを取得することができれば次のページにアクセスして同様にスクレイピングすることができそうです。

対象データを取得する方法を調べる

一例として、今回はスクレイピングでPrime Videoのタイトルを取得したいとしましょう。

出典: Amazon

検証ツールで確認すると、以下のようなHTML構造になっていることがわかりました。

赤枠で囲っているHTMLタグを指定した上でテキストを取得することができれば、スクレイピングとしてデータが取得できたと言えそうです。

JavaScript(Node.js) で実行するWebスクレイピングのやり方(コード)

では、実際にスクレイピングのコードを見ていきましょう。

最近は、Googleのヘッドレスブラウザを利用したpuppeteerでのスクレイピングが流行っていますが、今回は基礎の確認という意味であえてrequest-promisecheerioを使ったやり方を紹介します。

簡単に紹介しておくと、request-promiseはhttpリクエストを投げるクライアントツールで、cheerioは取得したHTMLページを解析する役割を持つツールです。

具体的な実装は以下のようになります。尚、今回のコードを実行しての不具合などは完全に自己責任となりますので、あらかじめご了承ください。

必要なパッケージを揃える

まずは、開発において必要なパッケージを揃えていきましょう。作業するディレクトリで下記のコマンドを実行します。

尚、実行するためにはNode.jsを事前にインストールする必要があります。

mkdir scraper
cd scraper
npm init -y 
npm install --save request request-promise cheerio

スクレイピングのコード

今回は、誤って何度もリクエストを投げないようにするため、クローリングの処理については省略しています。

ただし、titleと同じように次のページのリンクを取得すれば、クローリングも可能になります。

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

const url = 'https://www.amazon.co.jp/s?i=instant-video&__mk_ja_JP=カタカナ&ref=nb_sb_noss';

(async () => {
    // httpリクエストを投げる
    const response = await requestPromise(
      uri: url,
      gzip: true
    });
    let $ = cheerio.load(response);

    // 取得したいデータのタグを指定する
    let title = $('.a-section .a-size-medium.a-color-base.a-text-normal').text();
    console.log(title);

    return title;
  };
})();

何度も言いますが、スクレイピングはあくまでも最終手段として、どうしても方法がない時にだけ実行するように注意しましょう。

- 3ヶ月でエンジニア転職を目指そう -

  • 解決できないエラーに心が折れた
  • 転職に必要なレベルがわからない
  • 本当に今の学習で転職できるか不安

そんな悩みを持っている人に

現役エンジニアが教える3ヶ月でエンジニア転職を実現する方法

を解説しています。

コメント

コメントする

目次
閉じる