我正在尝试将包含标题数据的项目传递给我的piplines。解析中是否有这种方法,因为数据会被重置为下一页。我尝试super(mySpider,self).__init__(*args,*kwargs)
但数据未正确发送。我需要将网页的标题作为文件名,这就是我需要特定项目的原因。
像这样。
def __init__(self, item):
self.csvwriter = csv.writer(open(item['title'][0]+'.csv', 'wb'), delimiter=',')
self.csvwriter.writerow(['Name','Date','Location','Stars','Subject','Comment','Response','Title'])
答案 0 :(得分:2)
任何管道的输入都是您的项目。在您的情况下,您需要传递项目中的名称(或任何其他数据)。然后,您应该编写一个管道来将该项目写入文件系统(或数据库,或者您可以按照自己的意愿行事)。
让我们说你的新管道名为' NewPipeline'并且位于scrapy项目的主要根目录中。
在您的设置中,您需要将此管道定义为:
ITEM_PIPELINES = {
'YourRootDirectory.NewPipleline.NewPipeline':800
#add any other pipelines you have
}
你的管道应该是这样的:
class NewPipeline(object):
def process_item(self, item, spider):
name = item['name']
self.file = open("pathToWhereYouWantToSave"+ name, 'wb')
line = json.dumps(dict(item)) #change the item to a json format in one line
self.file.write(line)#write the item to the file
您可以将管道放入任何其他模块中。
答案 1 :(得分:1)
ItemPipeline的工作方式与您想象的不同。
如果你看the docs,你可以看到:
在一个项目被蜘蛛抓取之后,它被发送到项目管道,该项目管道通过顺序执行的几个组件处理它。
这意味着您传递的项目标题只会与该项目一起到达管道。并且默认情况下不保证项目的顺序,因此您不能指望一个项目作为第一个项目到达管道以设置标题。
另一种方法是标记此特定项目并在管道中查找。如果它没有到达,则存储项目直到它到达,写下标题并写入存储的项目。从现在开始,您可以将项目写入CSV文件。另一种方法是仅在蜘蛛完成爬行时写入项目。
但是我想知道为什么导出的标题不是为你使用的蜘蛛固定的......但是这可能会发生。