首页 > 解决方案 > 如何使用 Ruby 抓取动态网站

问题描述

我想抓取一个包含带有名称和描述的产品的 React 网站。HTML 结构如下所示:

<h6 class="menu-index-page__item-title" data-reactid=".5c2v.$menuItemContent.0">
  <span data-reactid=".5c2v.$menuItemContent.0.1">Product name</span>
</h6>
<p class="menu-index-page__item-desc" data-reactid=".5c2v.$menuItemContent.1">
  <span data-reactid=".5c2v.$menuItemContent.1.0">
    <span data-reactid=".5c2v.$menuItemContent.1.0.0">
      <span data-reactid=".5c2v.$menuItemContent.1.0.0.0:$0">Description line 1</span>
      <br data-reactid=".5c2v.$menuItemContent.1.0.0.0:$0br">
    <span data-reactid=".5c2v.$menuItemContent.1.0.0.$1">
      <span data-reactid=".5c2v.$menuItemContent.1.0.0.$1.0">
        <span data-reactid=".5c2v.$menuItemContent.1.0.0.$1.0.0">Description line 2</span>
          <span data-reactid=".5c2v.$menuItemContent.1.0.0.$1.0.1">…&lt;/span>
      </span>
    </span>
  </span>
</p>

如果描述有更多或更少的行,span标签的数量将会改变,从而使 XPath 搜索无效。

每个页面上每个产品返回的唯一内容是:

.$menuItemContent.1.0.0.0:$0 

对于描述的第一行和

.$menuItemContent.1.0.0.$1.0.0 

对于描述的第二行。

我可以使用正则表达式从data-reactid属性中获取这部分吗?

我现在正在使用 Nokogiri。

标签: ruby-on-railsreactjsdynamicweb-scrapingnokogiri

解决方案


一旦网页完成显示,价格很可能由 javascript 动态加载。

为了能够抓取动态加载的数据,您需要使用Rails 5 支持的像Watir这样的库。

使用 Watir,您可以等到所有脚本都执行完毕并加载所有数据后,再尝试抓取该站点。


推荐阅读