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

时间:2012-07-17 15:17:05

标签: ruby screen-scraping nokogiri watir watir-webdriver

我一直在使用Ruby和Nokogiri从hollister网站提取类似于此网址的网址中的数据: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页面有某种异步数据加载,这样当我的脚本检查页面区域的页面元素的订单特定数据时,它还不存在。 I.E.,<h3> data-property=GBL_ORDERNUMBERSYMBOL尚未存在,但在浏览器中如果再加载10秒,则DOM和HTML会更改以反映特定的订单详细信息。

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

我不知道如何使用Open-URI,但如果你想使用Watir-Webdriver,以下工作。

require 'watir-webdriver'
b = Watir::Browser.new
b.goto('http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=1316358')
puts b.h3(:class, 'order-num').when_present.text

请注意,在h3标记上执行了when_present()。这意味着脚本会在尝试获取文本之前等待h3出现。如果您知道有些部分需要花时间加载,那么添加显式等待通常可以解决问题。

答案 2 :(得分:0)

关注@ benaneesh的回答我不得不做一些修改,让它在我的ruby脚本中工作,而不是显示未知的url消息......

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

include Capybara::DSL
Capybara.current_driver = :webkit

Capybara::Webkit.configure do |config|
  config.block_unknown_urls
  config.allow_url("*mysite.com")
end

#... rest of code