我一直在使用 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/