之前scrapy都是存储在文件中,该考虑一下数据库了。
当前工作爬取的内容(不是前面说的豆瓣小组)实际上很多都是文档型的,类似于文章+评论的样式,其中文章又包括标题、作者、地址等。使用传统关系数据库当然也可以,使用ID和外键连接就可以了。但既然有了文档型的非关系数据库,就试试吧。
选择了MongoDB,网上查了下,主要特性如下:
- 面向集合(Collenction-Oriented):意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table)。
- 模式自由(schema-free):意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
- 查询与索引方式灵活,是最像SQL的Nosql
MongoDB支持多种语言,这里结合scrapy,选择python,文档地址在这里
简单地说,mongodb中包含三元素:数据库、集合(collection)、文档(document),其中“集合”就是对应关系数据库中的“表”,“文档”对应“行”。
试用了一下,感觉使用起来不要太简单!!!
- 安装MongoDB,可以从官网直接下载安装适合自己系统的版本。
运行:
- 创建数据文件夹:默认是在\data\db目录下,自己新建了一个数据文件夹
E:\MongoDB
- 指定数据文件夹:我的MongoDB安装后.exe文件位于
C:\Program Files\MongoDB\Server\3.0\bin
下,使用命令行运行db服务:
C:\Program Files\MongoDB\Server\3.0\bin\mongod.exe --dbpath E:\MongoDB
如果目录中有空格,则需要用“”将整个目录包起来
- 创建数据文件夹:默认是在\data\db目录下,自己新建了一个数据文件夹
使用:
结合我们之前的工作,在pipeline里将数据存储到mongodb中,修改pipelines.py,老规矩,贴代码:
from pymongo import MongoClient
class MongoDBPipeline(object):
def __init__(self):
client = MongoClient()
self.db = client.primer
def process_item(self, item, spider):
self.db.post.insert(dict(item))
return item
我使用的是3.0版本,不同版本的代码不同,具体的注意查看文档。
首先申明了一个client,然后定义了数据库,名字叫做“primer”,需要注意的是这里的primer可以是原本不存在的,这种情况下会新建一个。也可以使用另外一种写法db = client['primer']
在处理item的时候,执行了insert操作,这里定义了collection为“post”,和之前数据库定义一样,如果post不存在则新建,将dict格式的item插入数据库中。
ok,这就完成了,简单的有点难以置信……
去看看数据库吧,的确存在了…………
附一个挺好用的mongo客户端: Robomongo