美文网首页我爱编程
Scrapy 如何配置 MongoDB

Scrapy 如何配置 MongoDB

作者: Paycation | 来源:发表于2018-05-06 23:14 被阅读46次

配置环境
MacOS, Python3.6, scrapy 1.5

安装 MongoDB

安装 mongodb

brew install mongodb

启动服务,否则会报 connection failed。也可以通过 mongod 启动。

brew services start mongodb

安装 pymongo

pip install pymongo

Scrapy 配置

spiders/your_spider.py

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose
from your.items import YourItem

class YourItemLoader(ItemLoader):
    def get_id(value):
        return value.strip()
    default_item_class = YourItem
    default_output_processor = TakeFirst()
    id_in = MapCompose(get_id)

class YourSpider(scrapy.Spider):
     ...
    def parse(self, response):
        for block in response.xpath('//ul[@id="houselist-mod-new"]'):
            l = YourItemLoader(selector=block) # 
            l.add_xpath('title', 'div[@class="house-details"]/a/text()')
            l.add_xpath('id', 'div[@class="house-details"]/a/text()')
            return load_item() 

在 your_spider.py 下的 YourSpider 类下定义即可。
其中 MapCompose 的作用是用一个特定的函数预处理一个字段。例如用 get_id 这个自定义函数处理 id 这个字段,这样就不需要把数据的清理放到 parse 里,造成代码过于臃肿。
default_output_processor = TakeFirst() 的意义在于:让返回的 item 的字段不再是列表。如果不加这行,返回的字段都是 list 对象。

settings.py

ITEM_PIPELINES = {
   'your.pipelines.MongoDBPipeline': 300,
}
MONGO_URI = 'mongodb://127.0.0.1:27017'
MONGO_DATABASE = 'fangdb'  # 可以自定义

pipelines.py

import pymongo

class MongoDBPipeline(object):
    collection_name= 'youritems'  # 数据库中 collection 的命名
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE') 
        )
    def open_spider(self,spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
    def close_spider(self, spider):
        self.client.close()
    def process_item(self, item, spider):
        self.db[self.collection_name].insert(dict(item))
        return item

这部分的代码来自官方文档
至此,已经配置完毕。

查看数据库

通过命令行查看:

mongo # 默认连接到 127.0.0.1:27017,连接远程数据库需要带其他参数
show dbs # 显示所有数据库
db # 查看当前的数据库,一般是返回 test
use fangdb # 切换到该数据库,之后 db 就用来代指这个数据库了
db.fangitems.find().pretty() # 打印数据库的内容
# 效果大致如下:
{
    "_id" : ObjectId("5aef1930140c1f5a0f2aa642"),
    "title" : "虽说是以前的装修,但是保护的很好,中间楼层,小区环境不错",
    "link" : "https://mianyang.anjuke.com/prop/view/A1216411683?from=filter&spread=filtersearch&invalid=1&position=1&kwtype=filter&now_time=1525618992",
    "id" : "A1216411683",
    "room" : "2室2厅",
    "area" : "88m²",
    "floor" : "共4层",
    "year" : "1990年建造",
    "addr" : "花园小区 | 涪城-涪城-临园大道与金菊街交汇处",
    "total" : "62万",
    "unit" : "7045元/m²"
}
{
    "_id" : ObjectId("5aef1930140c1f5a0f2aa643"),
    "title" : "想投 资的赶紧来了 跃进路上 繁华地段 价格便宜 税费低!!",
    "link" : "https://mianyang.anjuke.com/prop/view/A1212834910?from=filter&spread=filtersearch_t&position=2&kwtype=filter&now_time=1525618992",
    "id" : "A1212834910",
    "room" : "2室2厅",
    "area" : "66m²",
    "floor" : "低层(共7层)",
    "year" : "2000年建造",
    "addr" : "高水小区 | 涪城-涪城-涪城区跃进路北段87号",
    "total" : "42万",
    "unit" : "6363元/m²"
}
....

也可以使用图形化工具查看。
下载地址 https://robomongo.org
界面大概如下:

image.png

相关文章

网友评论

    本文标题:Scrapy 如何配置 MongoDB

    本文链接:https://www.haomeiwen.com/subject/uiuurftx.html