ruby - 如何从主页加载后加载特定数据的页面中抓取数据?

标签 ruby screen-scraping nokogiri watir watir-webdriver

我一直在使用 Ruby 和 Nokogiri 从类似于 hollister 网站上的这个 URL 中提取数据:http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=1316358

我的脚本现在看起来像这样:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

page = Nokogiri::HTML(open("http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=1316358")) 

puts page.css("h3[data-property=GLB_ORDERNUMBERSYMBOL]")[0].text

我的问题是 Hollister 页面有某种异步加载数据的方式,因此当我的脚本检查页面区域以及页面元素的订单特定数据时,它还不存在。即,<h3>data-property=GBL_ORDERNUMBERSYMBOL尚不存在,但在浏览器中,如果您让它再加载十秒钟,DOM 和 HTML 会更改以反射(reflect)特定的订单详细信息。

捕获事后加载的数据的最佳方法是什么?我尝试过使用 watir-webdriver,但也不确定我需要做什么才能让它发挥作用。

最佳答案

尝试安装 Capybara-webkit (确保安装了 QtWebKit,否则 gem 安装会失败)。这将为您提供 headless 解决方案。然后试试这个:

require 'capybara-webkit'
require 'capybara/dsl'
require 'nokogiri'
require 'open-uri'

url = 'http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=1316358'
#change the capybara config to DSL and to use webkit
include Capybara::DSL
Capybara.current_driver = :webkit
visit(url)
doc = Nokogiri::HTML.parse(body)

然后像往常一样解析正文。要删除所有错误消息,请尝试以下操作:

Capybara.register_driver :webkit do |app|
  Capybara::Driver::Webkit.new(app, :stdout => nil)
end

关于ruby - 如何从主页加载后加载特定数据的页面中抓取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11525599/

相关文章:

javascript - Google脚本编辑器代码可提取多个视频 View

mysql - 在保存到数据库之前将日期数据转换为正确的日期时间格式?

ruby-on-rails - Nokogiri 是针对 LibXML 版本 2.9.1 构建的,但已动态加载 2.8.0

ruby - Nokogiri 在 heroku 上产生不同的结果?

ruby - 为什么 local_variables 会返回尚未分配的局部变量?

ruby-on-rails - 自制软件、FreeTDS、tiny_tds。 FreeTDS安装成功后为什么安装不了tiny_tds?

ruby - RSpec 为/lib 的子目录中的代码引发 NameErrors

ruby-on-rails - Ruby - 如何使用 sort_by 对一个数组与另一个数组进行排序?

php - CasperJS 将数据传回 PHP

ruby-on-rails - 如何使用 Nokogiri 根据选择标签的内容获取选择标签的 'value'