我正在使用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循环?任何帮助表示赞赏。
答案 0 :(得分:1)
在 if id == nil {
return "No Driver Assigned"
}
else{
drivers.["name"] as! String
}
return "test"
}
循环如此简单的情况下更改它是一个选项。如果它变得更复杂,我会切换到自定义项目导出器来编写项目,因为预期的结果是在spider和result之间留下透明度。
考虑到这一点(并为未来的变化做准备),我要说创建自己的项目导出器并形成生成的JSON元素。最终在itertools.cycle
的帮助下。