2015-09-11 17 views
5

Ecco il codice che ho usato per l'analisi della pagina web. L'ho fatto nella console di rails. Ma non sto ottenendo alcun output nella mia console di rails. Il sito che voglio raschiare sta avendo lazy loadingCome raschiare le pagine che hanno il carico pigro

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 

risposta

4

Hai 2 opzioni qui:

  1. switch HTTP pura raschiando a qualche strumento che supporta javascript di valutazione, come ad esempio Capybara (con proper driver selezionato). Questo può essere lento, dal momento che si esegue il browser headless sotto il cofano più dovrai impostare alcuni timeout o un altro modo per assicurarti che i blocchi di testo che ti interessano siano caricati prima di iniziare qualsiasi scraping.

  2. La seconda opzione consiste nell'utilizzare la console di sviluppo Web e capire come vengono caricati quei blocchi di testo (quali AJAX chiama, i relativi parametri e così via) e implementarli nel raschietto. Questo è un approccio più avanzato, ma più performante, dal momento che non farai alcun lavoro extra, come hai fatto nell'opzione 1.

Buona giornata!

UPDATE:

Il tuo codice di cui sopra non funziona, perché la risposta è il codice HTML avvolto in oggetto JSON, mentre si sta cercando di analizzare come HTML grezzo. Ecco come si presenta:

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

Quello che vi serve è JSON unwrap e poi analizzare come 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 

Vorrei anche advise you against utilizzando open-uri dal momento che il codice può diventare vulnerabile se si utilizzano URL dinamici perchè del modo in cui open-uri funziona (leggi l'articolo collegato per i dettagli) e utilizza librerie buone e più funzioni come HTTParty e RestClient.

UPDATE 2: lo script minima di esercizio per me:

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

ho controllato in console ... tutte le chiamate Ajax ha stesso parametro, tranne pagina senza ...... unica cosa che cambia è la pagina senza & ho già messo la pagina n. in segnaposto e messa in loop –

+0

Se apri questo URL in un browser: 'http://www.justdial.com/functions/ajxsearch.php?national_search=0&act=pagination&city=Delhi+%2F+NCR&search = Pandit & where = Delhi + Cantt & catid = 1195 & psearch = & prid = & page = 2' mostra qualche risposta JSON, sembra funzionare bene, non è vero? –

+0

il mio URL reale è questo http://www.justdial.com/Delhi-NCR/Pandits-%3Cnear%3E-delhi/ct-1195 url che ho citato nella mia domanda l'ho preso dalla console –