欢迎访问宙启技术站
智能推送

Scrapy+MongoDB:将爬取的数据存储到数据库

发布时间:2024-01-04 03:08:40

Scrapy是一个强大、灵活的Python爬虫框架,可以用于从网站上抓取数据。MongoDB是一种非关系型数据库,它提供了灵活的数据存储和查询功能。在Scrapy中将数据存储到MongoDB中十分方便,下面是一个简单的使用例子。

首先,需要确保已经安装了Scrapy和pymongo库。可以使用以下命令进行安装:

pip install Scrapy
pip install pymongo

接下来,我们创建一个新的Scrapy项目。打开终端并执行以下命令:

scrapy startproject scrapy_mongodb_example

这将在当前目录下创建一个名为scrapy_mongodb_example的新文件夹,其中包含了Scrapy项目的文件结构。

进入到项目的目录中:

cd scrapy_mongodb_example

创建一个新的Spider,我们将爬取一个简单的示例网站,抓取其中的标题和链接。在终端中执行以下命令:

scrapy genspider example_spider example.com

这将在spiders文件夹下创建一个名为example_spider.py的Spider文件。

打开example_spider.py文件,并进行如下修改:

import scrapy
from scrapy_mongodb_example.items import ExampleItem

class ExampleSpider(scrapy.Spider):
    name = 'example_spider'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    def parse(self, response):
        items = []
        for sel in response.xpath('//div[@class="item"]'):
            item = ExampleItem()
            item['title'] = sel.xpath('a/text()').get()
            item['link'] = sel.xpath('a/@href').get()
            items.append(item)
        return items

这里我们定义了一个ExampleSpider,它从网页中抓取带有"class"属性值为"item"的div元素,并提取其中的标题和链接。抓取的结果存储在ExampleItem对象中,并通过yield关键字返回给Scrapy框架。

现在,我们需要定义ExampleItem对象。创建一个名为items.py的文件,并添加以下代码:

import scrapy

class ExampleItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

ExampleItem继承自scrapy.Item类,我们定义了两个字段title和link,这些字段将用于存储抓取的数据。

接下来,我们需要将抓取结果存储到MongoDB中。在settings.py文件中添加以下代码:

ITEM_PIPELINES = {
    'scrapy_mongodb_example.pipelines.ExamplePipeline': 300,
}

MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'scrapy_mongodb_example'
MONGODB_COLLECTION = 'example_items'

这里我们定义了一个名为ExamplePipeline的Pipeline,并将其添加到ITEM_PIPELINES中。我们还指定了MongoDB的服务器地址和端口,以及要使用的数据库和集合。

创建一个名为pipelines.py的文件,并添加以下代码:

import pymongo

class ExamplePipeline(object):
    def __init__(self, server, port, db, collection):
        self.server = server
        self.port = port
        self.db = db
        self.collection = collection

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            server=crawler.settings.get('MONGODB_SERVER'),
            port=crawler.settings.get('MONGODB_PORT'),
            db=crawler.settings.get('MONGODB_DB'),
            collection=crawler.settings.get('MONGODB_COLLECTION'),
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.server, self.port)
        self.db = self.client[self.db]

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

    def process_item(self, item, spider):
        self.db[self.collection].insert_one(dict(item))
        return item

这里我们定义了一个ExamplePipeline类,它继承自scrapy.pipelines.Pipeline类。在这个类中,我们实现了open_spider、close_spider和process_item三个方法。open_spider方法在Spider启动时被调用,用于建立与MongoDB的连接;close_spider方法在Spider关闭时被调用,用于关闭MongoDB的连接;process_item方法则在抓取到每一个Item时被调用,用于将Item存储到MongoDB中。

最后,执行以下命令启动爬虫:

scrapy crawl example_spider

爬虫将从示例网站上抓取数据,并将其存储到MongoDB中。

这就是使用Scrapy将数据存储到MongoDB中的简单例子。你可以根据自己的需求对代码进行修改和扩展,实现更复杂的功能。