2

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

如何从 XML 提要中获取所有数据?有没有可以传递给 Nokogiri 的选项或可以在 curl 上设置的标志?我查看了 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>

如果我在浏览器中访问该 url,它最初看起来像上面,但随后会加载更多项目,如下所示(最终超过 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>

以下是初始请求的请求和响应标头: 初始请求的请求和响应标头

以下是网站图标的请求和响应标头,以防万一: favicon 的请求和响应标头

4

2 回答 2

1

页面很可能正在使用 AJAX 加载 XML。(如果您可以使用 Firebug 获取 XHR 以准确查看他们用来附加新 XML 的 POST 请求,它可能会给您/我们一个更好的主意)

说起来有点难过,但是 Nokogiri 以及 Mechanize(另一个基于 Nokogiri 构建的 XML 解析/抓取工具)不以任何方式支持 Javascript,因此无法获取推送到页面的数据通过 AJAX 无需重新加载页面(这可能是也可能不是您的选择)。

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

另一种方法是使用完全支持 Javascript 的浏览器模拟器。Watir 和 Selenium 是我所知道的两个,它们可以让您防止重新加载页面以接受传入的更改(尽管我个人没有使用过任何一个,因为我使用 Mechanize 的大部分工作我已经能够解决 Javascript通过重新获取页面或手动发送 GET/POST)。使用这两个 gem 的缺点是模拟整个浏览器带来的体积庞大。

瓦提尔 - http://rubygems.org/gems/watir

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

于 2013-08-29T16:54:42.573 回答
1

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

于 2013-08-29T18:42:52.947 回答