14.3 设置链家网爬虫 pipeline
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 中通过刷新的方法,实时查看爬取到的数据。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论