scrapy 讓指定的spider執行指定的pipeline


處理scrapy中包括多個pipeline時如何讓spider執行制定的pipeline管道
1:創建一個裝飾器
from scrapy.exceptions import DropItem
import functools
'''
當有多個pipeline時,判斷spider如何執行指定的管道
'''


def check_spider_pipeline(process_item_method):
    @functools.wraps(process_item_method)
    def wrapper(self, item, spider):
        # message template for debugging
        msg = '%%s %s pipeline step' % (self.__class__.__name__,)
        if self.__class__ in spider.pipeline:#判斷要執行的spider中是否包含所需的pipeline 如果有則執行否則拋出DropItem信息
            spider.logger.debug(msg % 'executing')
            return process_item_method(self,item,spider)
        # otherwise, just return the untouched item (skip this step in
        # the pipeline)
        else:
            spider.logger.debug(msg % 'skipping')
            raise DropItem("Missing pipeline property")
    return wrapper
2:在每個spider所在的類中添加一個pipeline數組,里面包含要執行的pipeline的名字
 -*- coding: utf-8 -*-
from scrapy.spiders import CrawlSpider,Rule
# from scrapy.selector import Selector
from ..items import BotcnblogsItem,BotItem
from scrapy.linkextractors import LinkExtractor
import re
from ..BotcnblogsPipeline import BotcnblogsPipeline
class CnblogsSpider(CrawlSpider):
    pipeline = set([BotcnblogsPipeline,])
    #爬蟲名稱
    name = "cnblogs"
    #設置允許的域名
    allowed_domains = ["cnblogs.com"]
    #設置開始爬去的頁面
    start_urls = (
        'http://www.cnblogs.com/fengzheng/',
    )
    
    rules=(
           Rule(LinkExtractor(allow=('fengzheng/default.html\?page\=([\d]+)')),callback='parse_item',follow=True),
#            Rule(LinkExtractor(allow=('fengzheng/p/([\d]+).html')),callback='parse_info',follow=True),
           )
           
3:在要執行的pipeline中的process_item方法加上裝飾器,這樣就可以過濾pipeline了
import json
from .checkpipe import  check_spider_pipeline
class BotcnblogsPipeline(object):
    
    def __init__(self):
        self.file=open('jd.json','w+')
        
    @check_spider_pipeline
    def process_item(self,item,spider):
        #此處如果有中文的話,要加上ensure_ascii=False參數,否則可能出現亂碼
        record=json.dumps(dict(item),ensure_ascii=False)+"\n"
        self.file.write(record)
        return item
    
    def open_spider(self,spider):
        print("打開爬蟲了")
        
    def close_spider(self,spider):
        print("關閉爬蟲")
        self.file.close()

 

具體例子可以參考其中的cnblogs spider的例子 下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM