如何从主页面加载后加载特定数据的页面抽取数据?(How do I scrape data from

2019-07-30 11:30发布

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

我的问题是,霍利斯特页面有某种数据的异步加载,这样当我的脚本检查页面与页面元素为了特定数据的区域,它还不存在的。 IE浏览器中, <h3>data-property=GBL_ORDERNUMBERSYMBOL还不存在,但在浏览器中,如果你让它加载另一个十秒钟,DOM和HTML的改变,以反映具体订单的详情。

什么是捕捉到了这个数据的事后加载的最佳方式? 我已经使用的Watir-webdriver的尝试,但不知道是什么,我需要做的,使一个工作无论是。

Answer 1:

我不知道如何与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

请注意, when_present()是在H3标签进行。 这意味着,该脚本将等待H3在试图获取其文本前出现。 如果你知道有这需要时间来加载部分,添加一个明确的等待通常会解决此问题。



Answer 2:

尝试安装水豚,WebKit的 (请确保您已经安装了QtWebKit的,否则创业板安装会失败)。 这会给你一个无头的解决方案。 那么试试这个:

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


Answer 3:

继@ 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


文章来源: How do I scrape data from a page that loads specific data after the main page load?