0

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

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

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

管道.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它将创建一个具有browser_statistics-date格式的 csv 文件并将数据从项目写入 csv 文件

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

谁能告诉我

无论如何,是否可以运行多个具有相同 process_item 和不同项目的蜘蛛?

4

1 回答 1

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
于 2012-11-19T13:35:40.613 回答