📒

Webサイトをクロールして全ページのURLとtitleをCSVファイルに保存する方法(Node.js)

2023/04/08に公開

この記事では、Node.jsを使ってWebサイトをクロールし、内部リンクをたどって、ページごとのタイトルとURLを取得して、CSVファイルに保存する方法をシェアします。

このコードを使うことで、Webサイト内部のページを簡単に探索し、そのページのタイトルやURLを一度に取得することができます。このような機能は、WebサイトのSEO対策やWeb解析にとって役立つのではないでしょうか。

Webサイトをクロールして、タイトルとURLをCSVファイルに保存するコード

const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');

// Site url to crawl
const startUrl = 'https://example.com/';

const visitedUrls = new Set();
const urlTitleList = [];

function writeCsvFile(data, filename) {
  const csvContent = data
    .map(({ url, title }) => {
      const escapedTitle = title.replace(/"/g, '""');
      return `"${url}","${escapedTitle}"`;
    })
    .join('\n');

  fs.writeFileSync(filename, csvContent, 'utf8');
}

async function crawl(url) {
  if (!visitedUrls.has(url)) {
    try {
      const response = await axios.get(url);
      const $ = cheerio.load(response.data);
      visitedUrls.add(url);

      const titleTag = $('title').text();
      urlTitleList.push({ url, title: titleTag });

      // このページ内のリンクを取得
      const links = [];
      $('a[href]').each((_, element) => {
        links.push($(element).attr('href'));
      });

      // さらにリンク先をクロール
      for (const link of links) {
        const absoluteUrl = new URL(link, startUrl).href;
        const parsedUrl = new URL(absoluteUrl);

        if (parsedUrl.hostname === new URL(startUrl).hostname) {
          // クロール先の負荷調整のため時間を調整する場合
          // await new Promise((resolve) => setTimeout(resolve, 500));
          await crawl(absoluteUrl);
        }
      }
    } catch (error) {
      console.error(`Error crawling ${url}:`, error.message);
    }
  }
}

(async () => {
  await crawl(startUrl);
  writeCsvFile(urlTitleList, 'url-title-list.csv');
  console.log(urlTitleList);
})();

Node.jsのパッケージであるaxiosとcheerioを使用して、WebサイトからページのHTMLを取得し、解析します。そして、各ページのURLとタイトルをリストに追加し、クロール済みのURLのリストを更新します。また、Webサイト内の各リンクをたどってクロールすることで、より多くのページを取得できます。ただし、クロール先は指定されたWebサイト内に限定されます。

使用方法

以下リポジトリを、cloneしてください。
https://github.com/hdmt/website-crawler

プロジェクトのディレクトリに移動して、必要なパッケージをインストールします。

npm install

クロールしたいサイトのURLを以下の箇所に指定してください。

const startUrl = 'https://example.com/';

クロールの実行

node app.js
// 実行結果。対象urlとtitleの全ページ分がコンソールに表示されます。
// [ { url: 'https://example.com/', title: 'Example Domain' } ]

url-title-list.csv でファイルが作られ、urlとtitleが書き出されます。

大規模なサイトの場合、サイト情報を取得できるま時間がかかるのと、クロール先へのサイトに負荷がかかる可能性があるので使用頻度などは注意が必要です。

以上、参考になればうれしいです。

PLAINCODE TECH BLOG

Discussion