仅检索XML Feed的一部分

时间:2016-04-28 15:34:09

标签: python xml web-scraping scrapy

我正在使用Scrapy XMLFeedSpider从网站解析一个大的XML源(60MB),我只是想知道是否有办法只检索它的一部分而不是全部60MB,因为现在消耗的RAM是非常高,也许可以放在链接中:

http://site/feed.xml?limit=10”,我搜索过是否有类似的东西,但我没有找到任何东西。

另一种选择是限制scrapy解析的项目,但我不知道如何做到这一点。现在,一旦XMLFeedSpider解析整个文档,机器人将仅分析前十项,但我认为整个饲料仍然在记忆中。 您是否知道如何提高机器人的性能,减少RAM和CPU消耗?感谢

2 个答案:

答案 0 :(得分:1)

您应该将XMLFeedSpider的迭代器模式设置为iternodes(请参阅here):

  

出于性能原因,建议使用iternodes迭代器

执行此操作后,您应该可以遍历Feed并在任何时候停止。

答案 1 :(得分:1)

当您处理大型xml文档时,您不希望像DOM解析器那样在内存中加载整个内容。您需要切换到SAX parser

  

SAX解析器比DOM样式解析器有一些好处。 SAX解析器   只需要在发生时报告每个解析事件,通常情况下   一旦报告,几乎丢弃所有这些信息(确实如此)   但是,保留一些东西,例如所有元素的列表   尚未关闭,为了赶上以后的错误,如   结束标签的顺序错误)。因此,a所需的最小内存   SAX解析器与XML文件的最大深度成比例(即,   (例如,XML树)以及单个XML事件中涉及的最大数据   (例如单个开始标记的名称和属性,或内容   处理指令等。)。

对于60 MB的XML文档,与创建DOM的要求相比,这可能非常低。大多数基于DOM的系统实际上使用更低的级别来构建树。

为了创建使用sax,子类xml.sax.saxutils.XMLGenerator和覆盖endElementstartElementcharacters。然后用它来调用xml.sax.parse。对不起,我手边没有详细的例子与您分享,但我相信您会在网上找到很多。