我正在研究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的不同项目运行多个蜘蛛?
答案 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