python scrapy中的管道文件中有多个process_item方法

时间:2012-10-18 10:39:05

标签: python scrapy pipeline

我正在研究scrapy,我在一个scrapy项目中创建了两个带有两个不同url的蜘蛛文件。

两只蜘蛛在单独跑动时完美刮擦。实际上问题是每个url都有不同的项目来获取,因此声明了items.py文件中的所有项目。 在抓取之后,我将数据存储到以蜘蛛名称动态创建的csv文件中。

因此,例如当我需要运行spider1时,我需要声明单独的process_item方法,因为两个蜘蛛的项目都不同,当我需要运行第二个蜘蛛时,我需要编写另一个{ {1}}通过评论其他方法。 scrapy中是否有任何方法可以使用两个process_item方法?以下是我的process_item代码

pipeline.py

pipeline.py

在上面的代码中,您观察到,当我运行名为from w3c_browser.items import WCBrowserItem import csv from csv import DictWriter from cStringIO import StringIO from datetime import datetime class W3CBrowserPipeline(object): def __init__(self): dispatcher.connect(self.spider_opened, signal=signals.spider_opened) dispatcher.connect(self.spider_closed, signal=signals.spider_closed) self.brandCategoryCsv = csv.writer(open('wcbbrowser.csv', 'wb')) def spider_opened(self, spider): spider.started_on = datetime.now() if spider.name == 'browser_statistics': log.msg("opened spider %s at time %s" % (spider.name,datetime.now().strftime('%H-%M-%S'))) self.brandCategoryCsv = csv.writer(open("csv/%s-%s.csv"% (spider.name,datetime.now().strftime('%d%m%y')), "wb"), delimiter=',', quoting=csv.QUOTE_MINIMAL) elif spider.name == 'browser_os': log.msg("opened spider %s at time %s" % (spider.name,datetime.now().strftime('%H-%M-%S'))) self.brandCategoryCsv = csv.writer(open("csv/%s-%s.csv"% (spider.name,datetime.now().strftime('%d%m%y')), "wb"), delimiter=',', quoting=csv.QUOTE_MINIMAL) def process_item(self, item, spider): self.brandCategoryCsv.writerow([item['year'], item['internet_explorer'], item['firefox'], item['chrome'], item['safari'], item['opera'], ]) return item # For Browser Os # def process_item(self, item, spider): # self.brandCategoryCsv.writerow([item['year'], # item['vista'], # item['nt'], # item['winxp'], # item['linux'], # item['mac'], # item['mobile'], # # # ]) # return item def spider_closed(self, spider): log.msg("closed spider %s at %s" % (spider.name,datetime.now().strftime('%H-%M-%S'))) work_time = datetime.now() - spider.started_on print str(work_time),"Total Time taken by the spider to run>>>>>>>>>>>" 的蜘蛛时,它将创建一个browser_statistics格式的csv文件,并将项目中的数据写入csv文件

但是,当我想运行名为browser_statistics-date的第二个蜘蛛时,process_item方法不起作用,因为两个蜘蛛都有不同的要提取的项目

任何人都可以让我知道

无论如何使用具有相同process_item的不同项目运行多个蜘蛛?

1 个答案:

答案 0 :(得分:0)

最佳选择是您可以在process_item中使用基于蜘蛛名称的 IF ELSE

喜欢

def process_item(self, item, spider):
    if 'spider1' in spider.name:
        #TODO write CSV for spider1
    else:
        #Should be a spider2
        #TODO write CSV for spider2
    return item