ホームページ >データベース >Redis >Redis と JavaScript を使用してシンプルな Web クローラーを構築する: データを迅速にクロールする方法

Redis と JavaScript を使用してシンプルな Web クローラーを構築する: データを迅速にクロールする方法

WBOY
WBOYオリジナル
2023-07-30 08:37:181331ブラウズ

Redis と JavaScript を使用してシンプルな Web クローラーを構築する: データをすばやくクロールする方法

はじめに:
Web クローラーは、インターネットから情報を取得するプログラム ツールであり、Web ページに自動的にアクセスできます。そしてその中のデータを解析します。 Web クローラーを使用すると、大量のデータを迅速にクロールして、データ分析とビジネス上の意思決定をサポートできます。この記事では、Redis と JavaScript を使用して単純な Web クローラーを構築する方法を紹介し、データを迅速にクロールする方法を示します。

  1. 環境の準備
    開始する前に、次の環境を準備する必要があります:
  2. Redis: タスク スケジューラとクローラのデータ ストレージとして使用されます。
  3. Node.js: JavaScript コードを実行します。
  4. Cheerio: HTML ページを解析するためのライブラリ。
  5. クローラ アーキテクチャ設計
    当社のクローラは分散アーキテクチャを採用し、タスク スケジューラとクローラ ノードの 2 つの部分に分かれます。
  • タスク スケジューラ: クロールされる URL を Redis キューに追加し、必要に応じて重複排除と優先順位の設定を実行します。
  • クローラー ノード: Redis キューからクロールされる URL を取得し、ページを解析し、データを抽出して Redis に保存します。
  1. タスク スケジューラのコード例
    タスク スケジューラのコード例は次のとおりです:
const redis = require('redis');
const client = redis.createClient();

// 添加待抓取的URL到队列
const enqueueUrl = (url, priority = 0) => {
  client.zadd('urls', priority, url);
}

// 从队列中获取待抓取的URL
const dequeueUrl = () => {
  return new Promise((resolve, reject) => {
    client.zrange('urls', 0, 0, (err, urls) => {
      if (err) reject(err);
      else resolve(urls[0]);
    })
  })
}

// 判断URL是否已经被抓取过
const isUrlVisited = (url) => {
  return new Promise((resolve, reject) => {
    client.sismember('visited_urls', url, (err, result) => {
      if (err) reject(err);
      else resolve(!!result);
    })
  })
}

// 将URL标记为已经被抓取过
const markUrlVisited = (url) => {
  client.sadd('visited_urls', url);
}

上記のコードでは、Redis Sorted set と set を使用します。データ構造では、順序付きセット urls はクロールされる URL の保存に使用され、セット visited_urls はクロールされた URL の保存に使用されます。

  1. クローラ ノードのコード例
    クローラ ノードのコード例は次のとおりです:
const request = require('request');
const cheerio = require('cheerio');

// 从指定的URL中解析数据
const parseData = (url) => {
  return new Promise((resolve, reject) => {
    request(url, (error, response, body) => {
      if (error) reject(error);
      else {
        const $ = cheerio.load(body);
        // 在这里对页面进行解析,并提取数据
        // ...

        resolve(data);
      }
    })
  })
}

// 爬虫节点的主逻辑
const crawler = async () => {
  while (true) {
    const url = await dequeueUrl();
    if (!url) break;

    if (await isUrlVisited(url)) continue;

    try {
      const data = await parseData(url);

      // 在这里将数据存储到Redis中
      // ...

      markUrlVisited(url);
    } catch (error) {
      console.error(`Failed to parse data from ${url}`, error);
    }
  }
}

crawler();

上記のコードでは、request# を使用しました。 ## library HTTP リクエストを送信し、cheerio ライブラリを使用してページを解析します。 parseData 関数では、cheerio ライブラリを使用してページを解析し、特定のページ構造とデータ抽出要件に従ってデータを抽出できます。クローラー ノードのメイン ロジックでは、ループして Redis キューからクロール対象の URL を取得し、ページの解析とデータ ストレージを実行します。

概要:

Redis と JavaScript を利用することで、大量のデータを迅速にクロールするシンプルかつ強力な Web クローラーを構築できます。タスク スケジューラを使用して、クロールする URL を Redis キューに追加し、ページ解析とデータ ストレージのためにクローラー ノードのキューから URL を取得できます。この分散アーキテクチャによりクロール効率が向上し、Redis のデータ ストレージと高性能機能により、大量のデータを簡単に処理できます。

以上がRedis と JavaScript を使用してシンプルな Web クローラーを構築する: データを迅速にクロールする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。