ホーム テクノロジー 開発 非公開: JavaScript で Web スクレイピングを始める

JavaScript で Web スクレイピングを始める

Web スクレイピングは、コーディングの世界で最も興味深いものの 1 つです。

Webスクレイピングとは何ですか?

なぜ存在するのでしょうか?

答えを見てみましょう。

JavaScript で Web スクレイピングを始める
JavaScript で Web スクレイピングを始める

Webスクレイピングとは何ですか?

Web スクレイピングは、Web サイトからデータを抽出する自動タスクです。

Webスクレイピングにはさまざまなアプリケーションがあります。商品の価格を抽出し、異なる電子商取引プラットフォームと比較します。ウェブから毎日の見積もりを取得します。 Google、Yahoo などの独自の検索エンジンを構築するなど、リストは続きます。

Web スクレイピングを使用すると、思っている以上のことができます。 Web サイトからデータを抽出する方法を理解したら、そのデータを使って何でもできるようになります。

Web サイトからデータを抽出するプログラムは Web スクレイパー と呼ばれます。 JavaScript で Web スクレイパーを作成する方法を学習します。

Webスクレイピングには主に2つの部分があります。

  • リクエスト ライブラリとヘッドレス ブラウザを使用してデータを取得します。
  • データを解析して、データから必要な正確な情報を抽出します。

さっそく始めましょう。

JavaScript で Web スクレイピングを始める
JavaScript で Web スクレイピングを始める

プロジェクトのセットアップ

Node がインストールされていると思いますが、インストールされていない場合は、NodeJS インストール ガイドを確認してください。

JavaScript での Web スクレイピングには node-fetch cheerio パッケージを使用します。サードパーティのパッケージを使用できるように、npm を使用してプロジェクトをセットアップしましょう。

セットアップを完了する手順を簡単に見てみましょう。

  • web_scraping というディレクトリを作成し、そこに移動します。
  • コマンド npm init 実行してプロジェクトを初期化します。
  • 好みに応じてすべての質問に答えてください。
  • 次に、次のコマンドを使用してパッケージをインストールします
npm install node-fetch cheerio

インストールされたパッケージの概要を見てみましょう。

ノードフェッチ

パッケージ node-fetch window.fetch をnode js環境にもたらします。これは、HTTP リクエストを作成して生データを取得するのに役立ちます。

チェリオ

Cherio パッケージは、生データから必要な情報を解析して抽出するために使用されます。

JavaScript での Web スクレイピングには、 node-fetch cheerio の 2 つのパッケージで十分です。パッケージが提供するすべてのメソッドを確認するわけではありません。 Webスクレイピングの流れとその中で最も役立つ方法を見ていきます。

実際にやってみるとWebスクレイピングが学べます。それでは、作業に移りましょう。

JavaScript で Web スクレイピングを始める
JavaScript で Web スクレイピングを始める

クリケットワールドカップリストの収集

このセクションでは、実際に Web スクレイピングを実行していきます。

何を抽出しているのでしょうか?

このセクションのタイトルから、簡単に推測できると思います。はい、あなたが考えていることはすべて正しいです。これまでのクリケットワールドカップの優勝者と準優勝者をすべて抽出してみましょう。

  • プロジェクト内に extract_cricket_world_cups_list.js というファイルを作成します。
  • 必要な情報を取得するには 、ウィキペディアのクリケット ワールド カップ ページを使用します。
  • まず、 node-fetch パッケージを使用して生データを取得します。
  • 以下のコードは、上記の Wikipedia ページの生データを取得します。
 const fetch = require("node-fetch");

// function to get the raw data
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};

// URL for data
const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";

// start of the program
const getCricketWorldCupsList = async () => {
   const cricketWorldCupRawData = await getRawData(URL);
   console.log(cricketWorldCupRawData);
};

// invoking the main function
getCricketWorldCupsList();

URLから生データを取得しました。次に、生データから必要な情報を抽出します。 Cherio パッケージを使用してデータを抽出しましょう。

Cheerio を使用して HTML タグを含むデータを抽出するのは簡単です。実際のデータに入る前に、 cheerio を使用したサンプルデータ解析を見てみましょう。

  • cheerio.load メソッドを使用して HTML データを解析します。
 const parsedSampleData = cheerio.load(
      `<div id="container"><p id="title">I'm title</p></div>`
   );
  • 上記の HTML コードを解析しました。そこから p タグの内容を抽出するにはどうすればよいですか? JavaScript の DOM 操作におけるセレクターと同じです。

console.log(parsedSampleData("#title").text());

必要に応じてタグを選択できます。さまざまな方法は cheerio公式ウェブサイト から確認できます。

完全なコードは次のとおりです。

 const fetch = require("node-fetch");
const cheerio = require("cheerio");

// function to get the raw data
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};

// URL for data
const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";

// start of the program
const getCricketWorldCupsList = async () => {
   const cricketWorldCupRawData = await getRawData(URL);

   // parsing the data
   const parsedCricketWorldCupData = cheerio.load(cricketWorldCupRawData);

   // extracting the table data
   const worldCupsDataTable = parsedCricketWorldCupData("table.wikitable")[0]
      .children[1].children;

   console.log("Year --- Winner --- Runner");
   worldCupsDataTable.forEach((row) => {
      // extracting `td` tags
      if (row.name === "tr") {
         let year = null,
            winner = null,
            runner = null;

         const columns = row.children.filter((column) => column.name === "td");

         // extracting year
         const yearColumn = columns[0];
         if (yearColumn) {
            year = yearColumn.children[0];
            if (year) {
               year = year.children[0].data;
            }
         }

         // extracting winner
         const winnerColumn = columns[3];
         if (winnerColumn) {
            winner = winnerColumn.children[1];
            if (winner) {
               winner = winner.children[0].data;
            }
         }

         // extracting runner
         const runnerColumn = columns[5];
         if (runnerColumn) {
            runner = runnerColumn.children[1];
            if (runner) {
               runner = runner.children[0].data;
            }
         }

         if (year && winner && runner) {
            console.log(`${year} --- ${winner} --- ${runner}`);
         }
      }
   });
};

// invoking the main function
getCricketWorldCupsList();

そして、こちらがスクレイピングしたデータです。

 Year --- Winner --- Runner
1975 --- West Indies --- Australia
1979 --- West Indies --- England
1983 --- India --- West Indies
1987 --- Australia --- England
1992 --- Pakistan --- England
1996 --- Sri Lanka --- Australia
1999 --- Australia --- Pakistan
2003 --- Australia --- India
2007 --- Australia --- Sri Lanka
2011 --- India --- Sri Lanka
2015 --- Australia --- New Zealand
2019 --- England --- New Zealand

すごいですね😎、そうですか?

JavaScript で Web スクレイピングを始める
JavaScript で Web スクレイピングを始める

スクレイピングテンプレート

URL から生データを取得することは、すべての Web スクレイピング プロジェクトで一般的です。変更される唯一の部分は、要件に従ってデータを抽出することです。以下のコードをテンプレートとして試すことができます。

 const fetch = require("node-fetch");
const cheerio = require("cheerio");
const fs = require("fs");
// function to get the raw data
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};
// URL for data
const URL = "https://example.com/";
// start of the program
const scrapeData = async () => {
   const rawData = await getRawData(URL);
   // parsing the data
   const parsedData = cheerio.load(rawData);
   console.log(parsedData);
   // write code to extract the data
   // here
   // ...
   // ...
};
// invoking the main function
scrapeData();

結論

Webページをスクレイピングする方法を学びました。次は、あなたがコーディングを練習する番です。

また、人気のある Web スクレイピング フレームワークやクラウドベースの Web スクレイピング ソリューションを調べてみることをお勧めします。

コーディングを楽しんでください 🙂

JavaScript で Web スクレイピングを始める
JavaScript で Web スクレイピングを始める

「 JavaScript で Web スクレイピングを始める」についてわかりやすく解説!絶対に観るべきベスト2動画

超簡単!自作でウェブスクレイピングアプリを作ってみよう!
Pythonスクレイピング開発 Vol.13 – JavaScriptを使ったページのスクレイピング – Pythonでクローリング・スクレイピング (2020.07.27)