捕获未立即加载的xml订阅源的内容

时间:2013-08-27 13:53:11

标签: ruby-on-rails ruby xml

我一直在使用Nokogiri提取XML Feed,它一直运行良好。添加了一个新的Feed,我需要将其拉入,并且不会立即加载所有Feed。如果我在浏览器中访问xml提要,我可以看到一组初始数据加载,然后很快就会加载更多数据。当我使用Nokogiri时,它只是获取初始数据集。我还尝试使用curl捕获feed,它得到了相同的结果。

如何从XML Feed中获取所有数据?有没有我可以传递给Nokogiri的选项或者我可以在卷曲上设置的旗帜?我查看了Nokogiri文档和curl手册页,但无法弄明白。

当我拉下数据时(使用Nokogiri或curl),它看起来像这样(虽然有很多超过2个项目):

<?xml version="1.0" encoding="UTF-8"?>
<item-syndication version="5">
  <item id="1">
    <more-data >lorem ipsum</more-data>
  </item>
  <item id="2">
    <more-data >lorem ipsum</more-data>
  </item>
</item-syndication>

如果我在浏览器中访问该网址,它最初看起来与上面一样,但是会加载更多项目,例如下面的内容(最终会有超过4项):

<?xml version="1.0" encoding="UTF-8"?>
<item-syndication version="5">
  <item id="1">
    <more-data >lorem ipsum</more-data>
  </item>
  <item id="2">
    <more-data >lorem ipsum</more-data>
  </item>
  <item id="3">
    <more-data >lorem ipsum</more-data>
  </item>
  <item id="4">
    <more-data >lorem ipsum</more-data>
  </item>
</item-syndication>

以下是初始请求的请求和响应标头: Request and Response Headers for initial request

以下是favicon的请求和响应标头,以防有用: Request and Response Headers for favicon

2 个答案:

答案 0 :(得分:1)

页面很可能是使用AJAX加载XML。 (如果您可以使用Firebug获取XHR以查看他们用于附加新XML的POST请求,它可能会给您/我们更好的想法)

这是一个有点伤感地说,但引入nokogiri,以及机械化不支持Javascript以任何方式,因此,(建立在引入nokogiri另一个XML解析/抓取工具)将不能够得到所推送的数据通过AJAX到页面而无需重新加载页面(可能是也可能不是你的选项)。

但是在一个循环中你可以选择每5秒加载一次页面30秒,并将XML与原始的scrape进行比较,这样就不会出现重复。你如何这样做完全取决于你,但是将值存储在REXML中并与新删除的值进行比较似乎不是最糟糕的选择。

另一种方法是使用完全支持Javascript的浏览器模拟器。 Watir和Selenium是我知道的两个将允许你阻止重新加载页面以接受传入的更改(虽然我个人也没有使用过,因为我的大多数工作使用Mechanize我已经能够解决Javascript通过重新获取页面或手动发送GET / POST。使用这两个宝石的缺点是模拟整个浏览器会带来巨大的压力。

Watir - http://rubygems.org/gems/watir

Selenium - http://rubygems.org/gems/selenium-webdriver

答案 1 :(得分:1)

所以,这个问题的正确答案是,我使用了错误的网址。通过使用正确的URL,我能够在Nokogiri和curl中获得预期的结果。