2015-09-11 2 views
5

Вот код, который я использовал для разбора веб-страницы. Я сделал это в консоли rails. Но я не получаю никакого вывода в моей консоли rails. Сайт, который я хочу очистить оказывает отложенной загрузкиКак очистить страницы с ленивой загрузкой

require 'nokogiri' 
require 'open-uri' 

page = 1 
while true 
    url = "http://www.justdial.com/functions"+"/ajxsearch.php?national_search=0&act=pagination&city=Delhi+%2F+NCR&search=Pandits"+"&where=Delhi+Cantt&catid=1195&psearch=&prid=&page=#{page}" 


    doc = Nokogiri::HTML(open(url)) 
    doc = Nokogiri::HTML(doc.at_css('#ajax').text) 
    d = doc.css(".rslwrp") 
    d.each do |t| 
    puts t.css(".jrcw").text 
    puts t.css("span.jcn").text 
    puts t.css(".jaid").text 
    puts t.css(".estd").text 
    page+=1 
    end 
end 

ответ

4

у вас есть 2 варианта здесь:

  1. переключатель чистый HTTP выскабливание в какой-то инструмент, который поддерживает яваскрипта оценки, такие как Капибара (с proper driver выбран). Это может быть медленным, поскольку вы используете браузер без браузера под капотом, плюс вам придется установить некоторые тайм-ауты или указать другой способ убедиться, что блоки текста, которые вас интересуют, загружаются, прежде чем начинать какие-либо выскабливания.

  2. Второй вариант - использовать консоль веб-разработчика и выяснить, как загружаются эти блоки текста (какие вызовы AJAX, их параметры и т. Д.) И реализовать их в вашем скребке. Это более продвинутый подход, но более эффективный, поскольку вы не будете делать никаких дополнительных работ, как вы делали в варианте 1.

Удачного дня!

UPDATE:

Ваш код выше не работает, потому что ответ является HTML-код, завернутые в объект JSON, в то время как вы пытаетесь разобрать его в качестве исходного HTML. Это выглядит следующим образом:

{ 
    "error": 0, 
    "msg": "request successful", 
    "paidDocIds": "some ids here", 
    "itemStartIndex": 20, 
    "lastPageNum": 50, 
    "markup": 'LOTS AND LOTS AND LOTS OF MARKUP' 
} 

Что вам нужно разворачивать JSON, а затем разобрать, как HTML:

require 'json' 

json = JSON.parse(open(url).read) # make sure you check http errors here 
html = json['markup'] # can this field be empty? check for the json['error'] field 
doc = Nokogiri::HTML(html) # parse as you like 

Я также advise you against с использованием open-uri, поскольку ваш код может стать уязвимой, если вы используете динамические URL, потому что open-uri (прочитайте связанную статью за подробностями) и используйте хорошие и более функциональные библиотеки, такие как HTTParty и RestClient. не

UPDATE 2: Минимальный рабочий сценарий для меня:

require 'json' 
require 'open-uri' 
require 'nokogiri' 

url = 'http://www.justdial.com/functions/ajxsearch.php?national_search=0&act=pagination&city=Delhi+%2F+NCR&search=Pandits&where=Delhi+Cantt&catid=1195&psearch=&prid=&page=2' 

json = JSON.parse(open(url).read) # make sure you check http errors here 
html = json['markup'] # can this field be empty? check for the json['error'] field 
doc = Nokogiri::HTML(html) # parse as you like 
puts doc.at_css('#newphoto10').attr('title') 
# => Dr Raaj Batra Lal Kitab Expert in East Patel Nagar, Delhi 
+0

я проверил его в консоли ... все Ajax вызова имеют тот же параметр, кроме страницы нет ...... Единственное, что Изменяется страница нет & я уже помещал страницу no в placeholder и помещал ее в цикл –

+0

Если вы откроете этот URL-адрес в браузере: 'http://www.justdial.com/functions/ajxsearch.php?national_search=0&act=pagination&city=Delhi+%2F+NCR&search = Pandits & where = Delhi + Cantt & catid = 1195 & psearch = & prid = & page = 2 он показывает некоторый ответ JSON, кажется, работает нормально, не так ли? –

+0

мой фактический url это http://www.justdial.com/Delhi-NCR/Pandits-%3Cnear%3E-delhi/ct-1195 url, о котором я упомянул в своем вопросе, я получил его с консоли –

Смежные вопросы