• Scrapy 教程(十)-管道与数据库


    Scrapy 框架将爬取的数据通过管道进行处理,即 pipelines.py 文件。

    管道处理流程

    一、定义 item

    item 表示的是数据结构,定义了数据包括哪些字段

    class TianqiItem(scrapy.Item):
        # define the fields for your item here like:
    
        city = scrapy.Field()           # 城市
        date = scrapy.Field()           # 日期
        hour = scrapy.Field()           # 小时
        day = scrapy.Field()            # 白天

    写法比较固定,不可随意更改;注意没有return

    二、在爬虫中生成 item

    爬虫组件必须将数据按 item 的结构进行组织

    item['city'] = response.xpath('//a[@id="lastBread"]//text()').extract_first()[:-4]
    item['date'] = '%s-%s-%s'%(year, month, day)
    item['hour'] = hour

    注意最终必须  return item;

    而且可以 返回多个 item,return item, item2,在某管道中,如果用了 item的key,就自动选择有这个key的item,否则,所有item都会经过该处理。

    三、在管道中处理

    1. 爬虫生成的 item 自动进入管道;

    2. 管道会判断 流入的数据 的类型 是否是 item;【即 item.py 中定义的类型】

    3. 如果是 item 类型,进行后续处理,否则,忽略;

    4. 返回 item,【必须返回,切记】【返回的 item 流入下一个管道,或者告诉引擎,处理完毕,否则引擎会阻塞】

    5. 爬取下一个

    class TianqiPipeline(object):
        def __init__(self):
            self.f = open('save.txt', 'ab')
    
        def process_item(self, item, spider):
            print(item)
            self.f.write(str(dict(item)))
            return item
    
        def close_spider(self, spider):
            self.f.close()
    
    
    class RedisPipeline(object):
        def open_spider(self, spider):
            host = spider.settings.get('REDIS_HOST', 'localhost')
            port = spider.settings.get('REDIS_PORT', 6379)
            db = spider.settings.get('REDIS_DB_INDEX', 0)
    
            self.redis_con = redis.StrictRedis(host=host, port=port, db=db)
    
        def process_item(self, item, spider):
            self.redis_con.hmset('%s:%s:%s'%(item['city'], item['date'], item['hour']), dict(item))
            return item
    
        def close_spider(self, spider):
            self.redis_con.connection_pool.disconnect()

    代码解释

    必选方法:process_item,负责处理数据

    可选方法:初始化,只在爬虫启动时进行初始化

    可选方法:open_spider,在开始爬取数据之前被调用

    可选方法:close_spider,爬取完数据后被调用

    可选方法:from_crawler,获取配置

    mongodb 示例,包含了上述方法

    首先执行 from_crawler 获取配置,在 open_spider 中创建数据库连接

    四、启动管道

    在settings中配置即可

    ITEM_PIPELINES = {
       'tianqi.pipelines.TianqiPipeline': 300,
       'tianqi.pipelines.RedisPipeline': 301,
    }

    存在问题

    上面这种方式 会作用于所有爬虫;

    我们可以在 管道中 判断 是哪个爬虫,根据 spider 参数,或者 根据 item 中的 key,但这种方法很冗余;

    更好的做法是在 spider类 中配置 custom_settings 对象

    # 类属性
    custom_settings = {'ITEM_PIPELINES': 
    {'getProxy.pipelines.GetproxyPipeline': 300, }} 

    数据库存储

    管道可以实现任何形式的存储,包括文件、数据库等;

    而且可以存入各种数据库,如 sqlite、mysql、mongoDB、redis;

    上面的例子实现了 redis、mongodb 的存储,其他大同小异,以后有机会再更新。

  • 相关阅读:
    remote: You are not allowed to push code to this project
    Ubuntu 查看本机的ip
    git跟踪远程分支,查看本地分支追踪和远程分支的关系
    edgedb 基本试用
    influxdb 全家桶运行
    Introducing Outflux: a smart way out of InfluxDB
    使用outflux 导入influxdb 的数据到timescaledb
    edgedb 强大的对象关系数据库
    Announcing the Operate Preview Release: Monitoring and Managing Cross-Microservice Workflows
    goaccess iis w3c 自定义log 格式参考
  • 原文地址:https://www.cnblogs.com/yanshw/p/10919052.html
Copyright © 2020-2023  润新知