#Python爬虫#Item Pipeline介绍(附爬取网站获取图片到本地代码)

本文详细介绍了Scrapy的Item Pipeline,包括编写自定义Pipeline、价格验证、存储到JSON、MongoDB、重复过滤及激活Pipeline。还讨论了Feed Exports的不同序列化格式,如JSON、CSV等。此外,重点讲述了Files和Images Pipeline的使用,如下载和处理文件与图像,以及如何在实际项目中应用,包括启用Pipeline、配置Items、创建Spider和自定义Image Pipeline的方法。
摘要由CSDN通过智能技术生成

1 Item Pipeline

当spider爬取到item后,它被发送到项目管道(Item Pipeline),通过几个组件按顺序进行处理。每一个Item Pipeline是一个实现了简单方法的Python类,它接收到一个item并对其执行一个操作,也要决定该item是否应该继续通过管道,或者被丢弃,不再进行处理。
Item Pipeline典型的用途是:
1.清理HTML数据
2.验证爬取的数据(检查items是否包含某些字段)
3.检查副本(并删除它们)
4.将item数据存储在数据库中

1.1 编写自己的Item Pipeline

每个Item Pipeline都是一个Python类,它必须实现以下方法:
process_item(self, item, spider)
这个方法可以被每个Item Pipeline调用,process_item()必须是:返回一个字典类型数据、返回一个条目(或任何子类)对象,返回一个 Twisted Deferred 或者DropItem异常,丢弃的item不再由进一步的Item Pipeline处理。
参数含义:
item: Item对象或字典,爬取的item
spider:spider对象,爬取了这个item的spider
此外,他们还可以实现以下方法:
open_spider(self, spider)
当spider打开时,函数就会被调用,spider参数含义:被打开的spider
close_spider(self, spider)
当spider关闭是,函数会被调用
from_crawler(cls, crawler)
如果存在,这个类方法被调用来从一个Crawler创建一个spider实例。它必须返回管道的一个新实例,Crawler对象提供对所有的scrapy核心组件的访问,比如设置和信号;这是管道访问它们并将其功能连接到scrapy的一种方式。

1.2 Pipeline示例

1.2.1 价格验证示例

from scrapy.exceptions import DropItem

class PricePipeline(object):

    vat_factor = 1.15

    def process_item(self, item, spider):
        if item['price']:
            if item['price_excludes_vat']:
                item['price'] = item['price'] * self.vat_factor
            return item
        else:
            raise DropItem("Missing price in %s" % item)

1.2.2 写入json文件

下面的Pipeline将所有经过的项目(从所有的spiders)存储到一个item.jl文件中,其中每行以JSON格式序列化:

import json

class JsonWriterPipeline(object):

    def open_spider(self, spider):
        self.file = open('items.jl', 'w')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item

1.2.3 写入MongoDB

在本例中,我们将使用pymongo将items写入MongoDB。MongoDB地址和数据库名称在scrapy settings中指定;MongoDB集合以item类命名。本例的主要目的是展示如何使用from_crawler()方法以及如何正确地清理资源。

import pymongo

class MongoPipeline(object):

    collection_name = 'scrapy_items'

    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', 'items')
        )

    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_one(dict(item))
        return item

1.2.4 重复过滤器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值