scrapy框架不同的爬虫程序设置不同pipelines

前言:scrapy是个非常不错的处理高并发的爬虫框架,其底层是异步框架 twisted,优势明显。

现在来看一个问题:当存在多个爬虫的时候如何指定对应的管道呢?

main.py定义了两个爬虫:

bidVtj、winbidVtj
execute(['scrapy','crawl','callbidVtj'])
execute(['scrapy', 'crawl', 'winbidVtj'])

1.可以在 pipeline 里判断是哪个爬虫的结果

settings里配置:

ITEM_PIPELINES = {
   'BuildingSpider.pipelines.BuildingSpiderPipeline': 300,
}

在pipeline文件里编写类MysipiderPipeline:

def process_item(self, item, spider):
    if spider.name == 'bidVtj':
        # 把要执行的sql放入连接池
        asynItem = copy.deepcopy(item)
        query = self.db_pool.runInteraction(self.insert_into_callbidsql, asynItem)
        # 如果sql执行发送错误,自动回调addErrBack()函数
        query.addErrback(self.callbid_handle_error, item, spider)
        # 返回Item
        return item
    elif spider.name == 'winbidVtj':
        # 把要执行的sql放入连接池
        asynItem = copy.deepcopy(item)
        query = self.db_pool.runInteraction(self.insert_into_winbidsql, asynItem)
        # 如果sql执行发送错误,自动回调addErrBack()函数
        # query.addErrback(self.windbid_handle_error, WinBid_item, spider)
        # 返回Item
        return item    

或者

 def process_item(self, item, spider):
        if isinstance(item,CallBidItem):
            # 把要执行的sql放入连接池
            asynItem = copy.deepcopy(item)
            query = self.db_pool.runInteraction(self.insert_into_callbidsql, asynItem)
            # 如果sql执行发送错误,自动回调addErrBack()函数
            query.addErrback(self.callbid_handle_error, item, spider)
            # 返回Item
            return item
        elif isinstance(item,WinBidItem):
            # 把要执行的sql放入连接池
            asynItem = copy.deepcopy(item)
            query = self.db_pool.runInteraction(self.insert_into_winbidsql, asynItem)
            # 如果sql执行发送错误,自动回调addErrBack()函数
            query.addErrback(self.windbid_handle_error, item, spider)
            # 返回Item
            return item

根据不同的爬虫名字,处理不同的逻辑,很完美,可以使用。

2.直接在爬虫里设置管道

stakoverflow里曾有有提出这个问题:https://stackoverflow.com/questions/8372703/how-can-i-use-different-pipelines-for-different-spiders-in-a-single-scrapy-proje/34647090#34647090

给出的最佳答案也是在单个爬虫里设置,不过要求scrapy版本必须是1.1以上

2.1spiders目录下的爬虫主程序设置custom_settings:

    callbidVtj.py文件中

class BidSpider(scrapy.spiders.Spider):
    name = "callbidVtj"
    allow_domains = ["tjconstruct.cn"]
    start_urls = ['http://www.tjconstruct.cn/Zbgg']
    custom_settings ={
        'ITEM_PIPELINES':{'BuildingSpider.pipelines.callbidVtjPipeline':300}
    }

     winbidVtj.py文件中

class WinBidSpider(scrapy.spiders.Spider):
    name = "winbidVtj"
    allow_domains = ["tjconstruct.cn"]
    start_urls = ['http://www.tjconstruct.cn/Zbgs'] 
    custom_settings = {
        'ITEM_PIPELINES': {'BuildingSpider.pipelines.winbidVtjPipeline': 350}
    }

2.2爬虫pipeline.py内的设置:

class callbidVtjPipeline(object):

 # 初始化函数

class winbidVtjPipeline(object):
 # 初始化函数

2.3settings.py设置

    因为要对应找到每个爬虫指定的管道,所以settings里也要进行管道配置:

ITEM_PIPELINES = {
   # 'BuildingSpider.pipelines.BuildingSpiderPipeline': 300,
      'BuildingSpider.pipelines.callbidVtjPipeline': 300,
      'BuildingSpider.pipelines.winbidVtjPipeline': 350,
}

 

 

你可能感兴趣的:(python,爬虫)