Scrapy :: JSON 导出问题
因此,我花了相当多的时间浏览 Scrapy 文档和教程,此后我一直致力于一个非常基本的爬虫。但是,我无法将输出放入 JSON 文件中。我觉得我错过了一些明显的东西,但在查看了许多其他示例并尝试了几种不同的方法后,我无法找到任何东西。
为了彻底起见,我将包含所有相关代码。我想要在这里获取的是一些特定的商品及其相关价格。价格会经常变化,而物品变化的频率要低得多。
这是我的 items.py :
class CartItems(Item):
url = Field()
name = Field()
price = Field()
这是蜘蛛:
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.item import Item, Field
from Example.items import CartItems
class DomainSpider(CrawlSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com/path/to/desired/page']
def parse(self, response):
hxs = HtmlXPathSelector(response)
cart = CartItems()
cart['url'] = hxs.select('//title/text()').extract()
cart['name'] = hxs.select('//td/text()').extract()[1]
cart['price'] = hxs.select('//td/text()').extract()[2]
return cart
例如,如果我从 URL http://www.example.com/path/to/desired/page,然后我得到以下回复:
u'Text field I am trying to download'
编辑:
好的,所以我按照我在 wiki 中找到的一个管道编写了一个管道(最近几天我在研究这个问题时不知何故错过了这一部分),只是更改为使用 JSON 而不是 XML。
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
from scrapy.contrib.exporter import JsonItemExporter
class JsonExportPipeline(object):
def __init__(self):
dispatcher.connect(self.spider_opened, signals.spider_opened)
dispatcher.connect(self.spider_closed, signals.spider_closed)
self.files = {}
def spider_opened(self, spider):
file = open('%s_items.json' % spider.name, 'w+b')
self.files[spider] = file
self.exporter = JsonItemExporter(file)
self.exporter.start_exporting()
def spider_closed(self, spider):
self.exporter.finish_exporting()
file = self.files.pop(spider)
file.close()
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
这确实输出了一个文件“example.com_items.json”,但它包含的只是“[]”。所以,我这里还是有些不对劲。是蜘蛛的问题,还是管道没有正确完成?显然我在这里遗漏了一些东西,所以如果有人可以将我推向正确的方向,或者给我链接任何可能有帮助的例子,那将是非常感激的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
JsonItemExporter
相当简单:所以,我有两个结论:
文件已创建 - 您的管道处于活动状态并挂钩
spider_opened
和spider_close
事件.process_item
永远不会被调用。也许没有项目被抓取,因此没有项目传递到此管道?另外,我认为代码中存在一个错误:
self.exporter = JsonItemExporter(file)
- 这是否意味着只有一个导出器始终处于活动状态?打开蜘蛛后,您将创建一个导出器。当该蜘蛛处于活动状态时,另一个蜘蛛可以打开,并且 self.exporter 将被新的导出器覆盖。JsonItemExporter
is fairly simple:So, i have two conclusions:
File is created - your pipeline is active and hooks
spider_opened
andspider_closed
events.process_item
is never called. Maybe no item is scraped, so no item is passed to this pipeline?Also, i think there is a bug in the code:
self.exporter = JsonItemExporter(file)
- doesn't this mean that there is only one exporter is active all the time? Once a spider is opened you create an exporter. While that spider is active another one can open, andself.exporter
will be overwritten by a new exporter.我从 JsonExportPipeline 复制了您的代码并在我的机器上进行了测试。
它与我的蜘蛛配合得很好。
所以我认为你应该检查该页面。
也许您的解析函数在提取内容时出现问题。这是下面的函数:
I copied your code from JsonExportPipeline and tested on my machine.
It works fine with my spider.
So I think you should check the page.
Maybe your parse function has something wrong of extracting the content. Which is the function below: