返回介绍

14.3 设置链家网爬虫 pipeline

发布于 2025-04-21 19:15:31 字数 4373 浏览 0 评论 0 收藏

14.3.1 在 Python 中操作 MongoDB

在 Python 中使用 MongoDB,需要首先安装 MongoDB 驱动,也就是 Python 操作 MongoDB 的接口包,这里使用 pymongo 包作为操作 MongoDB 的驱动。可以在命令行中使用执行如下命令安装 pymongo 包。

>pip install pymongo 

安装完成后,使用前首先引入这个包。

>>>import pymongo
>>>from pymongo import MongoClient 

下面用例子分步骤讲解如何通过 pymongo 使用 MongoDB 数据库。

1. 创建一个 MongoClient

>>>client = MongoClient()

上述代码将连接默认主机和端口。当然也可以明确指定主机和端口。

>>>client = MongoClient('localhost', 27017) 

这样就连接到了本机的 MongoDB,MongoDB 服务器默认使用 27017 端口。也可以使用 MongoDB URI 格式连接主机。

>>>client = MongoClient('mongodb://localhost:27017/') 

2. 访问或创建数据库

MongoDB 的一个实例可以支持多个独立的数据库。在使用 PyMongo 时,可以使用 MongoClient 实例属性的方式来访问数据库。

>>>db = client.pythondb 

如果数据库名称使用属性方式访问无法正常工作(如 client.python-db),则可以使用字典方式访问。

>>>db = client['python-db'] 

创建数据库实际是懒惰执行的,只有当第一条数据插入的时候,MongoDB 才会实际创建数据库。

3. 获取或创建集合

集合是存储在 MongoDB 中的一组文档,类似于关系数据库中的表。在 PyMongo 中获取集合的工作方式与获取数据库相同。

>>>collection = db.lianjia_collection 

也可以使用字典方式访问。

>>>collection = db['lianjia-collection'] 

MongoDB 集合是懒惰创建的,上述任何命令并没有在 MongoDB 服务器上实际执行操作。只有当第一个文档插入集合时,系统才创建集合和数据库。

4. 插入文档数据

PyMongo 中使用字典来表示文档数据,假如有以下数据。

>>>import datetime
>>>post = {"author": "guanghua",  
           "text": "My book!", "tags": ["mongodb", "python", "pymongo"], 
           "date": datetime.datetime.utcnow()}

使用 insert_one() 方法将上面的字典插入到集合中。

>>>collection.insert_one(post) 

执行完这条命令,系统就在服务器上创建了 db 数据库和 collection 集合,并在集合中插入一条 POST 数据,可以通过可视化软件 Robo 3T 查看 MongoDB 存储内容的变化。

5. 查询文档数据

MongoDB 中执行的最基本查询类型是 find_one()。此方法返回与查询匹配的单个文档(如果没有匹配,则返回 None)。当知道只有一个匹配的文档或只对第一个匹配感兴趣时,可考虑使用 find_one() 方法。下面示例中使用 find_one() 从 collection 集合中获取第一个文档。

>>>collection.find_one() 

执行上面的代码,得到以下结果。

{'_id': ObjectId('5ab87f7999af923474083d89'),
'author': 'guanghua',   
'date': datetime.datetime(2018, 3, 26, 5, 4, 47, 590000),   
'tags': ['mongodb', 'python', 'pymongo'],   
'text': 'My book!'}

结果匹配了之前插入的数据。注意:返回的文档包含一个“_id”字段,它是在数据插入 MongoDB 时自动添加的。

要查询作者是“Riyueguanghua”的文档,可以指定查询的条件。

>>>post = collection.find_one({"author": "Riyueguanghua"}) 

查询结果当然是空的。还可以使用 insert_many() 执行批量插入,首先构造待插入数据的列表。

>>>new_posts = [{"_id": 1000,
"author": "Youdian", "text": "Another book!",  
"tags": ["bulk", "insert"], "date": datetime.datetime(2018, 3, 16, 11, 14)}, 
{"_id": 1001,"author": "Guanghua",  
"title":"MongoDB is fun",  
"text": "book again!", "date": datetime.datetime(2018, 4, 12, 10, 45)}] 

然后执行如下命令插入多条数据。

>>>collection.insert_many(new_posts) 

14.3.2 配置 pipeline

通过第 11 章中的 Scrapy 架构解析,可以知道当 Item 在 spider 中被收集之后,它将被传递到 item pipeline,一些组件会按照一定的顺序执行对 Item 的处理。

每个 item pipeline 组件是实现了简单方法的 Python 类。它们接收到 Item 并执行一些行为,同时也决定此 Item 是继续通过 pipeline,还是被丢弃而不再进行处理。

以下是 item pipeline 的一些典型应用:清理 HTML 数据;验证爬取的数据(检查 Item 是否包含某些字段);查重(并丢弃);将爬取结果保存到数据库中。

Scrapy 通过在 pipeline 类中的 process_item 方法处理 Items,每个 item pipeline 组件都需要调用该方法,因此,数据存储主要就是在这个方法中执行,另外还可以定义 open_spider 方法和 close_spider 方法,用于在 spider 中打开和关闭时处理一些操作。下面以链家经纪人成交数据爬虫为例,演示如何把数据保存到 MongoDB。

import pymongo
from pymongo import MongoClient 
 
class Pachong5Pipeline(object): 
    #在 open_spider 方法中链接 MongoDB,创建数据库和集合,也可以在_ _init_ _初始化 
    #方法中处理这些操作 
    def open_spider(self, spider): 
        self.db = MongoClient('localhost', 27017) 
        self.collection = self.db.lianjia_collection 
    #定义 process_item 方法 
    def process_item(self, item, spider): 
        #把 Item 转化成字典方式,然后添加数据 
        self.collection.insert_one(dict(item))

这里在 open_spider 方法中连接了 MongoDB,读者也可以在__init__方法中连接 MongoDB,效果是相同的。

14.3.3 在 settings 中启用 pipeline

下面进行非常重要的一步,即在 settings.py 设置文件中启用定义好的 pipeline。

ITEM_PIPELINES={
   'pachong5.pipelines.Pachong5Pipeline': 300, 
}

这是一个 dict,它的 key 是定义的 pipeline 路径,其写法与下载器中间件类似,它的值代表执行顺序。

至此就完成了链家经纪人成交数据爬虫的代码编写,读者可以在命令行中定位到项目根目录,执行 scrapy crawl lianjia 命令,运行这个爬虫,爬取的数据将被保存在 MongoDB 中。在启动爬虫之前,要首先启动 MongoDB,这样才能把爬取的数据存储到数据库,开始爬虫后,可以在可视化工具 Robo 3T 中通过刷新的方法,实时查看爬取到的数据。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。