Hai 2 opzioni qui:
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.
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
fonte
2015-09-11 09:20:59
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 –
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? –
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 –