2010-10-01 10 views
5

Tengo una página de inicio de http://www.example.com/startpage que tiene 1220 listados divididos por paginación de la manera estándar, por ejemplo, 20 resultados por página.Ayuda necesaria con raspado de pantalla con anémona y nokogiri

Tengo un código de trabajo que analiza la primera página de resultados y sigue los enlaces que contienen "example_guide/paris_shops" en su url. Luego uso Nokogiri para obtener datos específicos de esa página final. Todo funciona bien y los 20 resultados se escriben en un archivo.

Sin embargo, parece que no puedo averiguar cómo hacer que Anemone también rastree la próxima página de resultados (http://www.example.com/startpage?page=2) y luego continúe analizando esa página y luego la 3ª página (http://www.example.com/startpage?page=3) y así sucesivamente.

Así que me gustaría preguntar si alguien sabe cómo puedo obtener una anémona para comenzar en una página, analizar todos los enlaces en esa página (y el siguiente nivel de datos específicos) pero luego seguir la paginación al página siguiente de resultados para que anémona pueda comenzar a analizar de nuevo y así sucesivamente. Dado que los enlaces de paginación son diferentes de los enlaces en los resultados, Anemone no los sigue.

En este momento estoy cargando la url para la primera página de resultados, dejando que termine y pegue en la siguiente url para la segunda página de resultados, etc. Muy manual e ineficiente especialmente para obtener cientos de páginas.

Cualquier ayuda sería muy apreciada.

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 

Respuesta

3

Sin tener HTML real o un sitio real para golpear es difícil dar ejemplos exactos. He hecho lo que intentas hacer muchas veces, y realmente solo necesitas open-uri y nokogiri.

Hay muchas maneras diferentes de determinar cómo pasar de una página a otra, pero cuando sepa cuántos elementos hay en una página y cuántas páginas hay, usaré un bucle simple de 1200/20 = 60 páginas. La esencia de la rutina se ve así:

 
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 

Es posible que desee examinar el uso de Mechanize para rastrear el sitio. No es un rastreador en sí mismo, sino que es un conjunto de herramientas que facilita navegar un sitio, completar formularios y enviarlos, gestionar la autenticación, las sesiones, etc. Utiliza Nokogiri internamente y hace que sea más fácil recorrer el documento y extraer cosas usando la sintaxis regular de Nokogiri.

+0

Gracias Greg - eso debería ayudarme a comenzar. Utilicé Anemone por su facilidad para captar páginas que coinciden con su "on_pages_like". Supongo que Nokogiri probablemente también pueda hacer esto, así que hurgaré en los documentos y veré qué obtengo. Una vez más, gracias por su ayuda – ginga

+0

Según su descripción de cómo se presentan las páginas, no necesita buscar la siguiente información de la página; Están usando un enlace estándar de la próxima página, así que simplemente rellene el número de página en una cadena y recupérelo. Nokogiri puede localizar fácilmente el enlace de la página siguiente, pero no parece que sea necesario, así que no pierdas el tiempo si puedes evitarlo. Esta página en Stack Overflow podría ayudar: http://stackoverflow.com/questions/2807500/following-a-link-using-nokogiri-for-scraping –

+0

Este truco funcionó para mí ... – Avishai

4

en realidad Anemone tiene el documento nokogiri incorporado. si llama a page.doc que es un documento de nokogiri, entonces no necesita tener dos documentos de nokogiri

Cuestiones relacionadas