前言:scrapy是个非常不错的处理高并发的爬虫框架,其底层是异步框架 twisted,优势明显。
现在来看一个问题:当存在多个爬虫的时候如何指定对应的管道呢?
main.py定义了两个爬虫:
bidVtj、winbidVtj
execute(['scrapy','crawl','callbidVtj'])
execute(['scrapy', 'crawl', 'winbidVtj'])
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
根据不同的爬虫名字,处理不同的逻辑,很完美,可以使用。
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以上。
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}
}
class callbidVtjPipeline(object):
# 初始化函数
class winbidVtjPipeline(object):
# 初始化函数
因为要对应找到每个爬虫指定的管道,所以settings里也要进行管道配置:
ITEM_PIPELINES = {
# 'BuildingSpider.pipelines.BuildingSpiderPipeline': 300,
'BuildingSpider.pipelines.callbidVtjPipeline': 300,
'BuildingSpider.pipelines.winbidVtjPipeline': 350,
}