使用while循环在单个json对象中保存Scrapy输出

时间:2015-07-23 10:50:19

标签: python arrays json while-loop scrapy

我正在使用while循环来抓取网页上的几个字段。我想在单个json对象中保存循环的每次迭代的输出。

这完全适用于我的机器(Scrapy 0.24.6,Python 2.7.5),但不适用于ssh服务器(Scrapy 1.0.1,Python 2.7.6)。我现在想要编写项目管道或项目导出器,以确保即使在ssh服务器上运行脚本时,循环的每次迭代也都保存为单个json对象。

这是我的Python代码:

from scrapy.spiders import Spider
from blogtexts.items import BlogItem

class BlogText1Spider(Spider):
name = "texts1"
allowed_domains = ["blogger.ba"]

start_urls = ["http://www.blogger.ba/profil/SOKO/blogovi/str1"]

def parse(self, response):
    position = 1

    while response.xpath(''.join(["//a[@class='blog'][", str(position), "]/@href"])).extract():
        item = BlogItem()
        item["blog"] = response.xpath(''.join(["//a[@class='blog'][", str(position), "]/@href"])).extract()
        item["blogfavoritemarkings"] = response.xpath(''.join(["//a[@class='broj'][", str(position), "]/text()"])).extract()
        item["blogger"] = response.url.split("/")[-3]
        yield item
        position = position + 1

我不希望输出看起来像这样:

{'blog': [u'http://emirnisic.blogger.ba', u'http://soko.blogger.ba'],
'blogfavoritemarkings': [u'180', u'128'],
'blogger': 'SOKO'}

输出应该是这样的:

{'blog': [u'http://emirnisic.blogger.ba'],
 'blogfavoritemarkings': [u'180'],
 'blogger': 'SOKO'}
{'blog': [u'http://soko.blogger.ba'],
 'blogfavoritemarkings': [u'128'],
 'blogger': 'SOKO'}

关于如何确保输出看起来像我想要的,您有什么建议吗?我应该使用项目管道或项目导出器,还是改变while循环?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

if id == nil { return "No Driver Assigned" } else{ drivers.["name"] as! String } return "test" } 循环如此简单的情况下更改它是一个选项。如果它变得更复杂,我会切换到自定义项目导出器来编写项目,因为预期的结果是在spider和result之间留下透明度。

考虑到这一点(并为未来的变化做准备),我要说创建自己的项目导出器并形成生成的JSON元素。最终在itertools.cycle的帮助下。