2012-07-17 60 views
2

我一直在使用Ruby和引入nokogiri从类似这样一个从霍利斯特网站的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 

我的问题是,霍利斯特页面具有某种异步加载的数据,这样当我的脚本使用页面元素的特定于订单的数据检查页面区域时,该页面不存在。 I.E.,<h3>data-property=GBL_ORDERNUMBERSYMBOL尚不存在,但在浏览器中如果让它再加载10秒,则DOM和HTML会更改以反映特定的订单详细信息。

什么是最好的方式来捕获这些事实后加载的数据?我尝试过使用watir-webdriver,但不知道我需要做些什么才能使这个工作。

+1

我认为你的意思是异步加载的AJAX。 – Linuxios 2012-07-17 15:44:25

+0

确保您遵守其使用政策。这对我来说并不明显,因为他们没有robots.txt,但这并不意味着您不必阅读其条件。 – 2012-07-17 19:28:52

回答

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出现。如果您知道有些部件需要时间加载,添加明确的等待通常会解决问题。

+0

Open :: URI只能在Ajax方法触发前检索原始页面。基于Watir的宝石是最好的解决方案。 – 2012-07-17 17:35:54

+0

太棒了 - 谢谢。这很好。最后一个问题:有没有办法让它实际上没有打开新的浏览器?如果我想刮多页,恐怕这可能需要很长时间......关于如何加速事情的想法? – 2012-07-17 19:43:50

+0

不打开新浏览器是什么意思?你的意思是你希望一切都在后台运行,或者你想使用现有的浏览器? – 2012-07-17 20:16:25

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

你会在哪里放置代码来删除“错误”消息?当我在“Capybara.current_driver =:webkit”之后添加它时,我在调用visit(url)时得到以下内容......'参数的错误数量(0表示0)' – daveomcd 2016-01-17 17:55:31

+0

作为一个头上的QT安装可能需要一段时间 - 在我的情况下2小时:https://github.com/Homebrew/legacy-homebrew/issues/4166 – JisuKim82 2017-04-17 16:06:58

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 
相关问题