Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Laksanakan rakaman dan analisis data berasaskan siri masa menggunakan Scrapy dan MongoDB

Laksanakan rakaman dan analisis data berasaskan siri masa menggunakan Scrapy dan MongoDB

WBOY
WBOYasal
2023-06-22 10:18:171652semak imbas

Dengan perkembangan pesat data besar dan teknologi perlombongan data, orang ramai semakin menumpukan perhatian kepada rakaman dan analisis data siri masa. Dari segi perangkak web, Scrapy ialah rangka kerja perangkak yang sangat baik, dan MongoDB ialah pangkalan data NoSQL yang sangat baik. Artikel ini akan memperkenalkan cara menggunakan Scrapy dan MongoDB untuk melaksanakan rakaman dan analisis data berasaskan siri masa.

1. Pemasangan dan penggunaan Scrapy

Scrapy ialah rangka kerja perangkak web yang dilaksanakan dalam bahasa Python. Kami boleh memasang Scrapy menggunakan arahan berikut:

pip install scrapy

Selepas pemasangan selesai, kami boleh menggunakan Scrapy untuk menulis perangkak kami. Di bawah ini kita akan belajar tentang penggunaan Scrapy melalui contoh crawler yang mudah.

1. Buat projek Scrapy

Dalam terminal baris arahan, buat projek Scrapy baharu melalui arahan berikut:

scrapy startproject scrapy_example

Selepas projek dibuat, kita boleh menggunakan arahan berikut Masukkan direktori akar projek:

cd scrapy_example

2. Tulis crawler

Kita boleh mencipta crawler baharu melalui arahan berikut:

scrapy genspider example www.example.com

Contohnya di sini ialah nama perangkak tersuai, www.example.com ialah nama domain tapak web yang dirangkak. Scrapy akan menjana fail templat perangkak lalai dan kami boleh mengedit fail ini untuk menulis perangkak.

Dalam contoh ini, kami merangkak halaman web ringkas dan menyimpan kandungan teks pada halaman web ke fail teks. Kod perangkak adalah seperti berikut:

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 Jalankan perangkak

Sebelum menjalankan perangkak, kami mula-mula menetapkan konfigurasi Scrapy. Dalam direktori akar projek, cari fail settings.py dan tetapkan ROBOTSTXT_OBEY kepada False supaya perangkak kami boleh merangkak mana-mana tapak web.

ROBOTSTXT_OBEY = False

Seterusnya, kita boleh menjalankan perangkak melalui arahan berikut:

scrapy crawl example

Selepas operasi selesai, kita boleh melihat fail example.txt dalam direktori akar projek, Ia menyimpan kandungan teks halaman web yang kami rangkak.

2. Pemasangan dan penggunaan MongoDB

MongoDB ialah pangkalan data NoSQL yang sangat baik. Kita boleh memasang MongoDB menggunakan arahan berikut:

sudo apt-get install mongodb

Selepas pemasangan selesai, kita perlu memulakan perkhidmatan MongoDB. Masukkan arahan berikut dalam terminal baris arahan:

sudo service mongodb start

Selepas berjaya memulakan perkhidmatan MongoDB, kami boleh mengendalikan data melalui MongoDB Shell.

1. Cipta pangkalan data

Masukkan arahan berikut dalam terminal baris arahan untuk menyambung ke pangkalan data MongoDB:

mongo

Selepas sambungan berjaya, kita boleh menggunakan arahan berikut untuk mencipta Pangkalan Data baharu:

use scrapytest

Paling keriput di sini ialah nama pangkalan data tersuai kami.

2. Cipta koleksi

Dalam MongoDB, kami menggunakan koleksi untuk menyimpan data. Kita boleh menggunakan arahan berikut untuk mencipta koleksi baharu:

db.createCollection("example")

Contohnya di sini ialah nama koleksi tersuai kami.

3. Masukkan data

Dalam Python, kita boleh menggunakan perpustakaan pymongo untuk mengakses pangkalan data MongoDB. Kita boleh menggunakan arahan berikut untuk memasang pustaka pymongo:

pip install pymongo

Selepas pemasangan selesai, kita boleh menggunakan kod berikut untuk memasukkan data:

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)

Data di sini adalah data yang kami mahu untuk memasukkan, termasuk tajuk dan kandungan dua medan.

4. Data pertanyaan

Kita boleh menggunakan kod berikut untuk menanyakan data:

import pymongo

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

Syarat pertanyaan di sini ialah "tajuk": "contoh", yang bermaksud pertanyaan medan tajuk adalah sama dengan data contoh. Hasil pertanyaan akan merangkumi keseluruhan dokumen data dan kami boleh mendapatkan nilai medan kandungan melalui hasil["kandungan"].

3. Penggunaan gabungan Scrapy dan MongoDB

Dalam aplikasi perangkak sebenar, kita selalunya perlu menyimpan data yang dirangkak ke pangkalan data dan merekodkan siri masa data dan menganalisis. Gabungan Scrapy dan MongoDB boleh memenuhi keperluan ini dengan baik.

Dalam Scrapy, kami boleh menggunakan saluran paip untuk memproses data yang dirangkak dan menyimpan data ke MongoDB.

1. Cipta saluran paip

Kami boleh mencipta fail bernama pipelines.py dalam direktori akar projek Scrapy dan mentakrifkan saluran paip kami dalam fail ini. Dalam contoh ini, kami menyimpan data yang dirangkak ke MongoDB dan menambah medan cap masa untuk mewakili cap masa rekod data. Kodnya adalah seperti berikut:

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

Saluran paip ini akan dipanggil setiap kali perangkak merangkak item. Kami menukar item yang dirangkak ke dalam kamus, menambah medan cap masa dan kemudian menyimpan keseluruhan kamus ke MongoDB.

2. Konfigurasikan saluran paip

Cari fail settings.py dalam direktori akar projek Scrapy, dan tetapkan ITEM_PIPELINES kepada saluran paip yang baru kami takrifkan:

rreee

The 300 di sini ialah Keutamaan saluran paip menunjukkan susunan pelaksanaan saluran paip di antara semua saluran paip.

3. Ubah suai kod perangkak

Ubah suai kod perangkak yang baru kami tulis dan hantar item ke saluran paip.

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

Di sini kami hanya merangkak kandungan teks pada halaman web dan menyimpan kandungan ke dalam medan teks. Scrapy akan menghantar item ini ke saluran paip yang ditentukan untuk diproses.

4. Data pertanyaan

Kini, kami boleh menyimpan data yang dirangkak ke MongoDB. Kita juga perlu melaksanakan rakaman dan analisis siri masa. Kami boleh menggunakan pertanyaan dan operasi pengagregatan MongoDB untuk mencapai ini.

Cari data dalam tempoh masa yang ditetapkan:

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()}

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

Atas ialah kandungan terperinci Laksanakan rakaman dan analisis data berasaskan siri masa menggunakan Scrapy dan MongoDB. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn