Как да изтрия данни от страница, която зарежда конкретни данни след зареждането на основната страница?

Използвах 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 да се задейства. Скъпоценните камъни на основата на Watir са най-доброто решение. - 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 получавам следното при извикване на visit(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