在piplines中传递刮削数据__init__ scrapy for python

时间:2015-07-30 06:45:51

标签: python scrapy pipeline

我正在尝试将包含标题数据的项目传递给我的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'])

2 个答案:

答案 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文件。另一种方法是仅在蜘蛛完成爬行时写入项目。

但是我想知道为什么导出的标题不是为你使用的蜘蛛固定的......但是这可能会发生。