Dio*_*des 17 csv exporter scrapy
我正在抓一个足球网站,蜘蛛(一只蜘蛛)从网站的页面中获取了几种项目:Team,Match,Club等.我正在尝试使用CSVItemExporter将这些项目存储在单独的csv文件中,teams.csv ,matches.csv,clubs.csv等.
我不确定这样做的正确方法是什么.到目前为止,我想到的唯一方法是创建我自己的自定义管道,如示例 http://doc.scrapy.org/en/0.14/topics/exporters.html, 并在spider_opened方法中打开所有需要的csv文件,即为每个csv文件创建一个csv导出器,并在process_item中放置代码以确定哪个项目是"item"参数,然后将其发送到相应的导出器对象.
无论如何,我没有找到任何处理scrapy中的多个csv文件(每个项目类型)的例子,所以我担心我以一种不打算使用它的方式使用它.(这是我第一次使用Scrapy).
迪奥梅德斯
Dio*_*des 24
我在这里发布了我用来生成MultiCSVItemPipeline基于上面的drcolossos答案的代码.
此管道假定所有Item类都遵循约定*Item(例如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
Run Code Online (Sandbox Code Playgroud)
DrC*_*sos 12
你对我的态度似乎很好.Piplines是Scrapy的一个很好的功能,是IMO的构建类似于你的方法.
您可以创建多个项目(例如SoccerItem,MatchItem),并MultiCSVItemPipeline通过检查项目类将每个项目委托给自己的CSV类.
| 归档时间: |
|
| 查看次数: |
6651 次 |
| 最近记录: |