ホームページ  >  記事  >  バックエンド開発  >  Scrapy と MongoDB を使用して時系列ベースのデータ記録と分析を実装する

Scrapy と MongoDB を使用して時系列ベースのデータ記録と分析を実装する

WBOY
WBOYオリジナル
2023-06-22 10:18:171652ブラウズ

ビッグデータとデータマイニング技術の急速な発展に伴い、時系列データの記録と分析に対する人々の注目が高まっています。 Web クローラーに関しては、Scrapy は非常に優れたクローラー フレームワークであり、MongoDB は非常に優れた NoSQL データベースです。この記事では、Scrapy と MongoDB を使用して時系列ベースのデータ記録と分析を実装する方法を紹介します。

1. Scrapy のインストールと使用方法

Scrapy は、Python 言語で実装された Web クローラー フレームワークです。次のコマンドを使用して Scrapy をインストールできます:

pip install scrapy

インストールが完了したら、Scrapy を使用してクローラーを作成できます。以下では、Scrapy の使用法を理解するために、簡単なクローラーの例を使用します。

1. Scrapy プロジェクトを作成する

コマンド ライン ターミナルで、次のコマンドを使用して新しい Scrapy プロジェクトを作成します:

scrapy startproject scrapy_example

プロジェクトが作成されたら、次のコマンドを使用できます。次のコマンド プロジェクトのルート ディレクトリを入力します:

cd scrapy_example

2. クローラーを作成します

次のコマンドを通じて新しいクローラーを作成できます:

scrapy genspider example www.example.com

例はこちらはカスタム クローラー名、www.example.com はクロールされた Web サイトのドメイン名です。 Scrapy はデフォルトのクローラ テンプレート ファイルを生成します。このファイルを編集してクローラを作成できます。

この例では、単純な Web ページをクロールし、Web ページ上のテキスト コンテンツをテキスト ファイルに保存します。クローラーのコードは次のとおりです:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ["https://www.example.com/"]

    def parse(self, response):
        filename = "example.txt"
        with open(filename, "w") as f:
            f.write(response.text)
        self.log(f"Saved file {filename}")

3. クローラーの実行

クローラーを実行する前に、まず Scrapy 構成を設定します。プロジェクトのルート ディレクトリで settings.py ファイルを見つけ、ROBOTSTXT_OBEY を False に設定して、クローラーが任意の Web サイトをクロールできるようにします。

ROBOTSTXT_OBEY = False

次に、次のコマンドを使用してクローラーを実行できます:

scrapy crawl example

操作が完了すると、プロジェクトのルート ディレクトリに example.txt ファイルが表示されます。クロールした Web ページのテキスト コンテンツ。

2. MongoDB のインストールと使用方法

MongoDB は非常に優れた NoSQL データベースです。次のコマンドを使用して MongoDB をインストールできます:

sudo apt-get install mongodb

インストールが完了したら、MongoDB サービスを開始する必要があります。コマンド ライン ターミナルに次のコマンドを入力します。

sudo service mongodb start

MongoDB サービスが正常に開始されたら、MongoDB シェルを通じてデータを操作できるようになります。

1. データベースを作成します

コマンド ライン ターミナルに次のコマンドを入力して、MongoDB データベースに接続します:

mongo

接続が成功したら、新しいデータベースを作成するには、次のコマンドを使用します。

use scrapytest

ここでのscrapytestは、カスタマイズしたデータベース名です。

2. コレクションの作成

MongoDB では、コレクションを使用してデータを保存します。次のコマンドを使用して新しいコレクションを作成できます:

db.createCollection("example")

ここでの例はカスタム コレクション名です。

3. データの挿入

Python では、pymongo ライブラリを使用して MongoDB データベースにアクセスできます。次のコマンドを使用して pymongo ライブラリをインストールできます:

pip install pymongo

インストールが完了したら、次のコードを使用してデータを挿入できます:

import pymongo

client = pymongo.MongoClient(host="localhost", port=27017)
db = client["scrapytest"]
collection = db["example"]
data = {"title": "example", "content": "Hello World!"}
collection.insert_one(data)

ここのデータが必要なデータですタイトルとコンテンツの 2 つのフィールドを含めて挿入します。

4. データのクエリ

次のコードを使用してデータをクエリできます:

import pymongo

client = pymongo.MongoClient(host="localhost", port=27017)
db = client["scrapytest"]
collection = db["example"]
result = collection.find_one({"title": "example"})
print(result["content"])

ここでのクエリ条件は "title": "example" であり、クエリを意味します。 title フィールドは例のデータと同じです。クエリ結果にはデータ ドキュメント全体が含まれ、result["content"] を通じてコン​​テンツ フィールドの値を取得できます。

3. Scrapy と MongoDB の併用

実際のクローラー アプリケーションでは、クロールされたデータをデータベースに保存し、データの時系列を記録する必要があることがよくあります。 Scrapy と MongoDB を組み合わせることで、この要件を十分に満たすことができます。

Scrapy では、パイプラインを使用してクロールされたデータを処理し、そのデータを MongoDB に保存できます。

1. パイプラインの作成

Scrapy プロジェクトのルート ディレクトリに Pipelines.py という名前のファイルを作成し、このファイルにパイプラインを定義します。この例では、クロールされたデータを MongoDB に保存し、データ レコードのタイムスタンプを表すタイムスタンプ フィールドを追加します。コードは次のとおりです。

import pymongo
from datetime import datetime

class ScrapyExamplePipeline:
    def open_spider(self, spider):
        self.client = pymongo.MongoClient("localhost", 27017)
        self.db = self.client["scrapytest"]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        collection = self.db[spider.name]
        item["timestamp"] = datetime.now()
        collection.insert_one(dict(item))
        return item

このパイプラインは、クローラーがアイテムをクロールするたびに呼び出されます。クロールされたアイテムを辞書に変換し、タイムスタンプ フィールドを追加して、辞書全体を MongoDB に保存します。

2. パイプラインの設定

Scrapy プロジェクトのルート ディレクトリで settings.py ファイルを見つけ、ITEM_PIPELINES を先ほど定義したパイプラインに設定します:

ITEM_PIPELINES = {
   "scrapy_example.pipelines.ScrapyExamplePipeline": 300,
}

The 300パイプラインの優先順位は、すべてのパイプラインの中でのパイプラインの実行順序を示します。

3. クローラー コードを変更する

先ほど作成したクローラー コードを変更し、アイテムをパイプラインに渡します。

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ["https://www.example.com/"]

    def parse(self, response):
        for text in response.css("p::text"):
            yield {"text": text.extract()}

ここでは、Web ページ上のテキスト コンテンツをクロールし、そのコンテンツをテキスト フィールドに保存するだけです。 Scrapy は、このアイテムを定義されたパイプラインに渡して処理します。

4. クエリ データ

これで、クロールされたデータを MongoDB に保存できます。時系列の記録と分析も実装する必要があります。これは、MongoDB のクエリと集計操作を使用して行うことができます。

指定した期間内のデータを検索:

import pymongo
from datetime import datetime

client = pymongo.MongoClient("localhost", 27017)
db = client["scrapytest"]
collection = db["example"]
start_time = datetime(2021, 1, 1)
end_time = datetime(2021, 12, 31)
result = collection.find({"timestamp": {"$gte": start_time, "$lte": end_time}})
for item in result:
    print(item["text"])

ここでは、2021 年のすべてのデータが検索されます。

统计每个小时内的记录数:

import pymongo

client = pymongo.MongoClient("localhost", 27017)
db = client["scrapytest"]
collection = db["example"]
pipeline = [
    {"$group": {"_id": {"$hour": "$timestamp"}, "count": {"$sum": 1}}},
    {"$sort": {"_id": 1}},
]
result = collection.aggregate(pipeline)
for item in result:
    print(f"{item['_id']}: {item['count']}")

这里我们使用MongoDB的聚合操作来统计每个小时内的记录数。

通过Scrapy和MongoDB的结合使用,我们可以方便地实现时间序列的数据记录和分析。这种方案的优点是具有较强的扩展性和灵活性,可以适用于各种不同的应用场景。不过,由于本方案的实现可能涉及到一些较为复杂的数据结构和算法,所以在实际应用中需要进行一定程度的优化和调整。

以上がScrapy と MongoDB を使用して時系列ベースのデータ記録と分析を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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