如何在项目对象中正确存储抓取的数据并将每个集合保存到1个csv文件?

时间:2019-04-22 20:10:29

标签: python beautifulsoup scrapy

所以我让我的小蜘蛛工作得很好。我正在按预期获取所有数据。我利用设置我的items.py来捕获我想要的7条数据。而且我可以将数据写到文件中。但是我现在遇到的问题是,我需要按照我们具有items.py设置的顺序将数据捕获到1个输出文件中。 Cant似乎想出了如何创建不存在的文件(站点名称和日期使其成为唯一的文件名)

这是我目前所拥有的,但是这会为每个被抓取的页面/ URL创建一个文件,我希望将所有这些内容合并到我们抓取的每个站点1个文件中。

我不喜欢使用itmDetails2格式化数据的方法,除非那是唯一的方法,但是我认为正弦dets []是我的items.py值列表,我可以简单地在其中存储每个集合,然后编写dets []转换为csv。

任何人都可以指出完成即时尝试的一个很好的例子吗?我找到了python / web抓取备忘单,并尝试了用于保存数据的示例,但是没有用

https://blog.hartleybrody.com/web-scraping-cheat-sheet/

            itmDetails2 = dets['sku'] +","+ dets['description']+","+ dets['price']+","+ dets['brand']+","+ dets['compurl']+","+ dets['reviewcount']+","+ dets['reviewrating']

            filename = 'dsg-%s.txt' % dets['description']

            with open(filename, 'w') as f:
                for its in itmDetails2:
                    f.write(str(its))

这是我的items.py文件,因为即时消息会在每个废话循环中捕获所有或大部分日期,所以如何将每个设置作为逗号分隔的行写到csv中?

import scrapy

class Dsg2Item(scrapy.Item):
description = scrapy.Field()
sku = scrapy.Field()
price = scrapy.Field()
brand = scrapy.Field()
compurl = scrapy.Field()
reviewcount = scrapy.Field()
reviewrating = scrapy.Field()

2 个答案:

答案 0 :(得分:0)

这里的问题是,打开文件时您正在使用w参数。这将导致文件每次被截断为零(内容被删除)。在Python中,属性与C standard library function fopen()相同。

  

w截短为零长度或创建要写入的文本文件。的                流位于文件的开头。

您应该改用a+,它将打开文件并将内容附加到末尾,而不是截断现有内容:

  

a+开放供阅读和写作。如果没有创建该文件                存在。流位于文件的末尾。 Subse-                对文件的后续写入将始终以当时的状态结束                文件结尾,无论是否有任何fseek(3)或类似内容。

示例:

itmDetails2 = dets['sku'] +","+ dets['description']+","+ dets['price']+","+ dets['brand']+","+ dets['compurl']+","+ dets['reviewcount']+","+ dets['reviewrating']

filename = 'dsg-%s.txt' % dets['description']

localLog = open(filename,"a+")
localLog.write(itmDetails2+"\r\n")
localLog.close()

我将进一步指出,每次创建一个新文件的原因是因为您正在根据描述创建文件名。如果您只需要一个文件名,请不要添加说明。

示例:

itmDetails2 = dets['sku'] +","+ dets['description']+","+ dets['price']+","+ dets['brand']+","+ dets['compurl']+","+ dets['reviewcount']+","+ dets['reviewrating']

localLog = open("dsg-all.txt","a+")
localLog.write(itmDetails2+"\r\n")
localLog.close()

答案 1 :(得分:0)

您可以使用csvwriter或在写入文件时使用附加模式。 也有tinydb用于本地json存储