使用scrapy将废弃的项目保存到json / csv / xml文件

时间:2014-02-04 15:53:50

标签: python scrapy

我正在从Scrapy学习official doc(网络抓取框架) 通过以下示例和文档,我使用站点地图

创建了我的蜘蛛来废弃数据
from scrapy.contrib.spiders import SitemapSpider
from scrapy.selector import Selector
from MyProject1.items import MyProject1Item

class MySpider(SitemapSpider):
    name="myspider"
    sitemap_urls = ['http://www.somesite.com/sitemap.xml']
    sitemap_follow = ['/sitemapbrowsesection\d+']
    count=0
    def parse(self, response):
        self.count=self.count+1
        item=MyProject1Item()
        sel=Selector(response)
        item["exp"]=sel.xpath('/html/head/title/text()').extract()
        print str(self.count)+":\t"+response.url
        print sel.xpath('/html/head/title/text()').extract()
        print "\n\n"

我可以通过运行命令
在日志中看到报废的结果 scrapy crawl myspider
我可以通过在命令
中添加选项将报废结果保存到json / csv / xml文件中 scrapy crawl myspider -o item.json -t json用于在json文件中获取结果。

我的问题是scrapy只有在使用抓取进行scrapy时才会将报废结果转储到item.json。意味着必须等到爬行结束。所以对于大项目我将不得不等待很长时间,因为我猜scrapy会在完成所有爬行后将报废结果写入json文件。

我希望scrapy能够及时或几乎立即写入json文件,或者在爬行过程中写入,这样我就可以看到在scrapy运行时已经爬行的站点的结果。

我知道在scrapy中必须有一些我无法捕获的东西。我试图从http://doc.scrapy.org/en/latest/topics/feed-exports.html获得帮助 和
http://doc.scrapy.org/en/latest/topics/exporters.html
但无法解决我的问题。所以我正在寻找一些帮助或示例代码,否则我必须在parse(self, response)函数中添加几行来创建json / csv文件并将废弃结果写入其中。

2 个答案:

答案 0 :(得分:1)

这就是写入文件的方式。只有当磁盘已满时,才会有一个缓冲区写入磁盘。

例如,在一个shell中使用python打开文件:

$ ipython

In [1]: fp = open('myfile', 'w')

在另一个shell中监视文件内容:

$ tail -f myfile

回到python shell并写一些内容:

In [2]: _ = [fp.write("This is my file content\n") for i in range(100)]

就我而言,我在tail输出中看不到任何内容。写更多内容:

In [3]: _ = [fp.write("This is my file content\n") for i in range(100)]

现在我看到tail输出中的行。

实际上,您可以更改文件缓冲(参见[1])。再次打开一个文件:

$ ipython

In [1]: fp = open('myfile', 'w', buffering=0)

监视另一个shell中的文件内容:

$ tail -f myfile

写一些内容并查看tail输出:

In [2]: fp.write("Hello there\n")

启用缓冲(减少磁盘I / O)是一件好事。您的items文件最终将获得输出,但您可能希望将格式更改为默认的jsonlines(不需要-t参数),每行得到一个json对象。它是一种使用频率很高的流媒体格式。

您可以轻松阅读jsonlines.jl分机号码):

import json

for line in open('items.jl'):
    data = json.loads(line)
    # do stuff with data

甚至包括head + json.tooljq等其他工具(参见[2]):

$ head -1 items.jl | python -m json.tool
$ jq -I . items.jl

到目前为止,我还没有看到任何问题,有大量的工作将项目写入.jl文件(或任何其他格式)。然而,如果你的工作被杀,你将丢失缓冲区中的最后一项。这可以通过将项目存储在数据库或类似的东西中来解决。

[1] http://docs.python.org/2/library/functions.html#open

[2] http://stedolan.github.io/jq/manual/

答案 1 :(得分:0)

scrapy crawl myspider -o item.json -t json仅在抓取时保存抓取的结果。我不必等待爬行才能完成。在爬虫运行时我可以看到文件item.json的内容

所以不需要包含用于将获取的数据写入蜘蛛文件的代码。