美文网首页零基础-一起学爬虫
【零基础学爬虫】scrapy中的pipline详解

【零基础学爬虫】scrapy中的pipline详解

作者: 大菜鸟_ | 来源:发表于2019-04-13 12:09 被阅读1次

    scrapy中的pipline主要可以用来:

    • 清洗爬取到的数据
    • 数据去重
    • 去除无效数据
    • 数据存储

    在定义pipline时,只需要定义一个类并实现process_item(self, item, spider)方法,参数中的item就是爬取到的每一个数据对象,spider是爬虫的实例。该方法主要有两种返回值:

    • item对象
    • DropItem 异常:即抛弃当前的item

    另外,在自定义的类中还可以实现下面几个方法:

    • open_spider(self, spider):当spider打开的时候该方法会被调用
    • close_spider(self, spider):当spider关闭的时候该方法会被调用
    • from_crawler(cls, crawler):当创建一个pipline实例的时候该方法会被调用,该方法必须返回一个pipline实例对象,一般用于获取scrapy项目的配置setting中配置的值

    自定义pipline

    1.数据清洗加工pipline实例

    from scrapy.exceptions import DropItem
    
    class PricePipeline(object):
    
        vat_factor = 1.15
    
        def process_item(self, item, spider):
            if item.get('price'):
                if item.get('price_excludes_vat'):
                    item['price'] = item['price'] * self.vat_factor
                return item
            else:
                raise DropItem("Missing price in %s" % item)
    

    如果价格信息没有缺失的话就进行一些操作,更新该值;否则直接丢弃该item

    2.将数据保存到jsonline文件

    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
    

    3.将数据写到mongdb数据库
    MongoDB 的URI和数据库名字都配置在Scrapy项目的 settings文件中;

    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  # 依旧需要返回item
    

    4.数据去重

    from scrapy.exceptions import DropItem
    
    class DuplicatesPipeline(object):
    
        def __init__(self):
            self.ids_seen = set()
    
        def process_item(self, item, spider):
            if item['id'] in self.ids_seen:
                raise DropItem("Duplicate item found: %s" % item)
            else:
                self.ids_seen.add(item['id'])
                return item
    

    pipline的使用

    写好pipline后我们需要使pipline生效,我们需要把pipline类配置到setting文件中:

    ITEM_PIPELINES = {
        'myproject.pipelines.PricePipeline': 300,
        'myproject.pipelines.JsonWriterPipeline': 800,
    }
    

    后面的300、800表示的是优先级,数字值越小,优先级越高,优先级高的pipline优先被调用


    另外,scrapy中还有middleware的概念,它主要是用来操作request和response的,例如配置代理:


    有关middleware的详细介绍可以查看官网的介绍

    扫描下方二维码,及时获取更多互联网求职面经javapython爬虫大数据等技术,和海量资料分享
    公众号菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;
    公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有

    扫码关注,及时获取更多精彩内容。(博主今日头条大数据工程师)

    相关文章

      网友评论

        本文标题:【零基础学爬虫】scrapy中的pipline详解

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