如何使用Ruby抓取动态网站

时间:2018-10-15 21:34:34

标签: ruby-on-rails reactjs dynamic web-scraping nokogiri

我想抓取一个带有名称和描述产品的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">…</span>
      </span>
    </span>
  </span>
</p>

如果描述中包含多行或少行,则span标签的数量将发生变化,因此使xpath搜索无效。

每页上每个产品返回的唯一信息是: .$menuItemContent.1.0.0.0:$0作为描述的第一行, .$menuItemContent.1.0.0.$1.0.0作为说明的第二行。

例如,我可以使用正则表达式从data-reactid属性中抓取这部分内容吗?

我现在正在使用Nokogiri。

谢谢

1 个答案:

答案 0 :(得分:0)

一旦网页显示完毕,价格就很可能由JavaScript动态加载。

要抓取动态加载的数据,您将需要使用Rails 5支持的Watir之类的库。

使用Watir,您可以等到执行所有脚本并加载所有数据之后再尝试刮取网站。