📅  最后修改于: 2023-12-03 15:09:07.598000             🧑  作者: Mango
在Scrapy爬取了一个网站的数据后,我们通常希望将这些数据存储在一个可靠的数据库中。MongoDB是一个非常流行的NoSQL数据库,适用于存储大量非结构化数据,这样我们可以使用它来存储我们的爬取数据并进行分析。
首先,我们需要在本地机器上安装MongoDB。我们可以在MongoDB的官方网站https://www.mongodb.com/try/download/community上下载并安装它。
要在Python中连接MongoDB,我们需要使用PyMongo客户端。您可以使用以下命令来安装它:
pip install pymongo
在代码中,首先,我们需要连接MongoDB,使用以下代码:
import pymongo
client = pymongo.MongoClient('localhost',27017)
在这个代码片段中,我们使用pymongo.MongoClient
类连接到本地的MongoDB数据库。在MongoClient
的构造函数中,我们需要传入MongoDB的地址和端口号。
在MongoDB中,类似于关系型数据库中的“表”,单个数据库可以拥有多个集合。为了将数据存储在MongoDB中,我们首先需要创建一个集合。
db = client['mydatabase']
collection = db['mycollection']
在这个例子中,我们首先使用client
实例访问我们要使用的数据库:mydatabase
。然后,我们创建了一个名为mycollection
的集合对象。
现在,我们需要将Scrapy爬取到的数据插入到MongoDB集合中。我们可以使用以下代码:
data = {'name': 'Jane', 'age': 23, 'city': 'New York'}
collection.insert_one(data)
在这个示例中,我们创建了一个Python字典对象,表示要插入到MongoDB的数据。然后,我们使用insert_one()
插入单个文档(即一个字典对象)到mycollection
集合中。
如果您有很多文档要插入到MongoDB中,您可以使用insert_many()
方法一次插入多个文档。如下:
datas = [{},{},...,{}}]
collection.insert_many(datas)
我们也可以使用代码从MongoDB读取数据,对于Scrapy爬虫来说,一般是查询之前爬取的数据。下面是一个例子:
data = collection.find_one({'name': 'Jane'})
print(data)
find_one
方法接受一个查询条件参数,返回满足该查询条件的第一个文档对象。如果你想获取满足查询条件的所有文档对象,可以将find_one
方法改为find
方法。
完成所有操作后,我们应该关闭MongoDB连接,以避免资源泄漏。
client.close()
import scrapy
import pymongo
class MySpider(scrapy.Spider):
name = 'myspider'
def __init__(self):
self.client = pymongo.MongoClient('localhost',27017)
self.db = self.client['mydatabase']
self.collection = self.db['mycollection']
def start_requests(self):
urls = [
'http://www.example.com/page1.html',
'http://www.example.com/page2.html',
...
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
item = {
'title': response.css('title::text').get(),
'content': response.css('#content').get(),
'url': response.url
}
self.collection.insert_one(item)
def close(self, spider):
self.client.close()
在这个示例代码中,我们创建了一个名为MySpider
的Scrapy爬虫。在__init__
方法中,我们连接到MongoDB,并在parse
方法中将Scrapy爬取的数据插入到MongoDB的mycollection
集合中。在close
方法中,我们关闭了MongoDB连接。
这就是如何将数据发送到Scrapy管道到MongoDB的全部内容。