2010-10-01 12 views
5

Ho una pagina iniziale di http://www.example.com/startpage che ha 1220 elenchi suddivisi per impaginazione nel modo standard, ad es. 20 risultati per pagina.Aiuto necessario con lo screen scraping usando anemone e nokogiri

Ho codice di lavoro che analizza la prima pagina dei risultati e segue i collegamenti che contengono "example_guide/paris_shops" nella loro url. Quindi uso Nokogiri per estrarre dati specifici di quella pagina finale. Tutto funziona bene e i 20 risultati sono scritti in un file.

Tuttavia non riesco a capire come ottenere Anemone per eseguire la scansione alla pagina successiva dei risultati (http://www.example.com/startpage?page=2) e quindi continuare ad analizzare quella pagina e poi la terza pagina (http://www.example.com/startpage?page=3) e così via.

Quindi vorrei chiedere se qualcuno sa come posso far sì che anemone inizi su una pagina, analizzare tutti i collegamenti su quella pagina (e il prossimo livello di dati per dati specifici) ma poi seguire l'impaginazione per la prossima pagina di risultati in modo che anemone possa ricominciare l'analisi e così via. Dato che i collegamenti di paginazione sono diversi dai collegamenti nei risultati, Anemone ovviamente non li segue.

Al momento sto caricando l'url per la prima pagina di risultati, lasciando quella finitura e quindi incollando nell'URL successivo per la seconda pagina di risultati ecc. Ecc. Molto manuale e inefficiente soprattutto per ottenere centinaia di pagine.

Qualsiasi aiuto sarebbe molto apprezzato.

require 'rubygems' 
require 'anemone' 
require 'nokogiri' 
require 'open-uri' 

Anemone.crawl("http://www.example.com/startpage", :delay => 3) do |anemone| 
    anemone.on_pages_like(/example_guide\/paris_shops\/[^?]*$/) do | page | 

doc = Nokogiri::HTML(open(page.url)) 

name = doc.at_css("#top h2").text unless doc.at_css("#top h2").nil? 
address = doc.at_css(".info tr:nth-child(3) td").text unless doc.at_css(".info tr:nth-child(3) td").nil? 
website = doc.at_css("tr:nth-child(5) a").text unless doc.at_css("tr:nth-child(5) a").nil? 

open('savedwebdata.txt', 'a') { |f| 
    f.puts "#{name}\t#{address}\t#{website}\t#{Time.now}" 
} 
    end 
end 

risposta

3

Senza l'HTML effettivo o un sito reale da colpire è difficile fornire esempi precisi. Ho fatto quello che stai cercando di fare molte volte, e hai davvero bisogno solo di open-uri e nokogiri.

Ci sono diversi modi per determinare come passare da una pagina all'altra, ma quando si conosce quanti elementi ci sono in una pagina e quante pagine ci sono io userei un ciclo semplice di 1200/20 = 60 pagine. L'essenza della routine è simile a:

 
require 'open-uri' 
require 'nokogiri' 

1.upto(60) do |page_num| 
    doc = Nokogiri::HTML(open("http://www.example.com/startpage?page=#{page_num}")) 
    # ... grab the data you want ... 
    # ... sleep n seconds to be nice ... 
end 

Si potrebbe voler esaminare utilizzando Mechanize per eseguire la scansione del sito. Non è un crawler di per sé, ma è invece un toolkit che semplifica la navigazione di un sito, compila moduli e li invia, gestisce autenticazione, sessioni, ecc. Utilizza Nokogiri internamente e facilita la lettura del documento e l'estrazione di oggetti usando la normale sintassi di Nokogiri.

+0

Grazie Greg - questo dovrebbe aiutare a farmi iniziare. Ho usato Anemone per la sua facilità di afferrare le pagine che corrispondono alle sue "on_pages_like". Immagino che Nokogiri possa anche farlo, quindi attaccherò i documenti e vedrò cosa ottengo. Ancora una volta, grazie per il tuo aiuto – ginga

+0

Dalla tua descrizione di come sono disposte le pagine, non è necessario cercare le informazioni sulla pagina successiva; Stanno usando un collegamento standard della pagina successiva, quindi inserisci il numero di pagina in una stringa e recuperalo. Nokogiri può facilmente individuare il collegamento alla pagina successiva, ma non sembra necessario, quindi non perdere tempo se puoi evitarlo. Questa pagina su Stack Overflow potrebbe aiutare: http://stackoverflow.com/questions/2807500/following-a-link-using-nokogiri-for-scraping –

+0

Questo trucco ha funzionato per me ... – Avishai

4

Anemone in realtà ha il doc nokogiri incorporato. se chiami page.doc che è un doc nokogiri quindi non è necessario avere due documenti nokogiri