ruby-on-rails - 如何使用 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">…</span>
</span>
</span>
</span>
</p>
如果描述有更多或更少的行,span
标签的数量将会改变,从而使 XPath 搜索无效。
每个页面上每个产品返回的唯一内容是:
.$menuItemContent.1.0.0.0:$0
对于描述的第一行和
.$menuItemContent.1.0.0.$1.0.0
对于描述的第二行。
我可以使用正则表达式从data-reactid
属性中获取这部分吗?
我现在正在使用 Nokogiri。
解决方案
一旦网页完成显示,价格很可能由 javascript 动态加载。
为了能够抓取动态加载的数据,您需要使用Rails 5 支持的像Watir这样的库。
使用 Watir,您可以等到所有脚本都执行完毕并加载所有数据后,再尝试抓取该站点。
推荐阅读
- dax - DAX - 根据测试完成顺序创建类别
- javascript - AngularJS 使用 selectize 和 ng-repeat 设置多选下拉列表的值
- chronicle - 编年史队列大小确定
- hash - 为什么几乎所有的网络服务器都不在客户端散列您的密码?
- google-apps-script - 从运行脚本的 Google 表格中格式化 Google Drive 搜索查询以获取名称 [first & last] 的最佳方法是什么?
- excel - 循环变量的 VBA
- vb.net - 我如何无法获得我所有的 combobox1 并发送到多行文本框
- youtube-api - 如何使用 angularfire2 FirebaseAuth Google 登录对 Youtube 进行身份验证?
- javascript - 异步调用
- sql - (QUERY) - 从特定范围中选择行