我刮足球网站,蜘蛛(单蜘蛛)得到几种物品从网站的页面:团队,比赛,俱乐部等我试图使用CSVItemExporter存储在单独的CSV文件,这些项目,teams.csv ,matches.csv,clubs.csv等
我不知道是什么做的正确方法。 到目前为止,我已经想到的唯一方法是创建自己的自定义管道像例如http://doc.scrapy.org/en/0.14/topics/exporters.html而且在spider_opened方法打开所有需要的CSV文件,即创建的每个csv文件,并在process_item放码的CSV出口弄清楚什么样的项目是“项目”参数,然后将其发送到相应的出口对象。
反正我还没有发现在scrapy处理多个CSV文件(每个项目类型),所以我担心,我在这并不意味着要使用的方式使用它的任何实例。 (这是我的Scrapy第一次的经验)。
迪奥梅德斯
你的方法似乎没什么问题。 Piplines是Scrapy的一个很大的特点,并IMO建立类似的做法。
你可以创建多个项目(例如SoccerItem,MatchItem),并在您的MultiCSVItemPipeline
刚刚通过检查项目类委托各项目自身的CSV类。
我在这里发布我用来生产代码MultiCSVItemPipeline
基于上述drcolossos的答案。
这条管道假设所有的项目类别按照惯例*项目(如TeamItem,EventItem)并创建team.csv,Event.csv的文件,并将所有记录到相应的CSV文件中。
from scrapy.exporters import CsvItemExporter
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher
def item_type(item):
return type(item).__name__.replace('Item','').lower() # TeamItem => team
class MultiCSVItemPipeline(object):
SaveTypes = ['team','club','event', 'match']
def __init__(self):
dispatcher.connect(self.spider_opened, signal=signals.spider_opened)
dispatcher.connect(self.spider_closed, signal=signals.spider_closed)
def spider_opened(self, spider):
self.files = dict([ (name, open(CSVDir+name+'.csv','w+b')) for name in self.SaveTypes ])
self.exporters = dict([ (name,CsvItemExporter(self.files[name])) for name in self.SaveTypes])
[e.start_exporting() for e in self.exporters.values()]
def spider_closed(self, spider):
[e.finish_exporting() for e in self.exporters.values()]
[f.close() for f in self.files.values()]
def process_item(self, item, spider):
what = item_type(item)
if what in set(self.SaveTypes):
self.exporters[what].export_item(item)
return item