ruby-on-rails - 捕获未立即加载的 xml feed 内容

标签 ruby-on-rails ruby xml

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

如何从 XML feed 中获取所有数据?是否有我可以传递给 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>

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

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

以下是图标的请求和响应 header ,以防有帮助: Request and Response Headers for favicon

最佳答案

该页面很可能正在使用 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

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

关于ruby-on-rails - 捕获未立即加载的 xml feed 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18467430/

相关文章:

ruby-on-rails - 将 Rails 应用程序部署到 Openshift : rhc - Username or password is not correct

ruby - 无法安装单用户版本的 RVM

ruby - Nokogiri::XML::Reader - 处理大型 XML 文件并跳过不感兴趣的节点

xml - xpath - if else 结构

javascript - 如何使用 google app 脚本循环遍历 xml 文件

java - 为什么使用 .war 文件部署时 getRealPath() 返回 null?

ruby-on-rails - Rails 的 RSS 阅读器

mysql - 限制用户仅查看 Rails 中的关联记录

ruby-on-rails - 通过 includes 从 id 数组中选择

ruby-on-rails - SSL 与 Ruby on Rails