Как очистить данные со страницы, которая загружает определенные данные после загрузки главной страницы?

Я использовал Ruby и Nokogiri для извлечения данных с URL-адреса, похожего на этот, с веб-сайта 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 имеет своего рода асинхронную загрузку данных, так что, когда мой скрипт проверяет область страницы с конкретными данными заказа для элемента страницы, она еще не существует. То есть <h3> с data-property=GBL_ORDERNUMBERSYMBOL еще не существует, но в браузере, если вы позволите ему загрузиться еще десять секунд, DOM и HTML изменятся, чтобы отразить конкретные детали заказа.

Каков наилучший способ захвата этих данных, которые загружаются постфактум? Я пытался использовать watir-webdriver, но не уверен, что мне нужно сделать, чтобы он тоже работал.


person Cam Norgate    schedule 17.07.2012    source источник
comment
Я думаю, вы имеете в виду AJAX для асинхронной загрузки.   -  person Linuxios    schedule 17.07.2012
comment
Убедитесь, что вы соблюдаете их политику использования. Это было не очевидно для меня, потому что у них не было файла robots.txt, но это не значит, что вам не нужно читать их условия.   -  person Dave McNulla    schedule 17.07.2012


Ответы (3)


Я не уверен, как это сделать с 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, прежде чем пытаться получить его текст. Если вы знаете, что для загрузки некоторых частей требуется время, добавление явного ожидания обычно решает проблему.

person Justin Ko    schedule 17.07.2012
comment
Open::URI может получить только исходную страницу до того, как сработает метод Ajax. Драгоценные камни на основе ватира – лучшее решение. - person the Tin Man; 17.07.2012
comment
Потрясающе - спасибо. Это хорошо работает. Последний вопрос: есть ли способ сделать так, чтобы watir фактически не открывал новый браузер? Боюсь, если бы я хотел очистить несколько страниц, это может занять много времени... мысли о том, как ускорить процесс? - person Cam Norgate; 17.07.2012
comment
Что значит не открывать новый браузер? Вы хотите, чтобы все работало в фоновом режиме, или вы хотите использовать существующий браузер? - person Justin Ko; 18.07.2012
comment
Мне интересно, есть ли хороший способ запустить несколько потоков - моя проблема в том, что открытие окна браузера, ожидание поиска данных, затем закрытие и открытие нового браузера требует времени - есть ли хороший способ запустить это быстрее в в фоновом режиме или с несколькими потоками одновременно? - person Cam Norgate; 18.07.2012
comment
Вы можете использовать один и тот же браузер для всей своей работы. Вам не придется закрывать и заново открывать новый. Многопоточность должна быть возможна, но вы должны быть осторожны с браузерами, разделяющими сеансы. Ваш лучший вариант действительно зависит от вашего контекста. Я бы предложил открыть новый вопрос и описать ваш сценарий. - person Justin Ko; 18.07.2012

Попробуйте установить 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
person benaneesh    schedule 23.07.2012
comment
куда бы вы поместили код, чтобы удалить сообщения об ошибках? Когда я добавляю его после Capybara.current_driver = :webkit, я получаю следующее при вызове визита (url)... wrong number of arguments (2 for 0) - person daveomcd; 17.01.2016
comment
На заметку, установка qt может занять некоторое время — в моем случае 2 часа: github. com/Homebrew/legacy-homebrew/issues/4166 - person JisuKim82; 17.04.2017

После ответа @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
person daveomcd    schedule 17.01.2016