2012-10-04 30 views
5

Estoy intentando codificar un simple raspado web en ruby. Funciona hasta el 29 url entonces consigo este mensaje de error:RUBY - web scraping - (OpenURI :: HTTPError)

C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:346:in `open_http': 500 Internal Server Er 
ror (OpenURI::HTTPError) 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:201:in `catch' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:677:in `open' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:33:in `open' 
     from test.rb:24:in `block (2 levels) in <main>' 
     from test.rb:18:in `each' 
     from test.rb:18:in `block in <main>' 
     from test.rb:14:in `each' 
     from test.rb:14:in `<main>' 

Mi código:

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

aFile=File.new('data.txt', 'w') 

ag = 0 
    for i in 1..40 do 
    agenzie = ag + 1 

    #change url parameter 

    url = "http://www.infotrav.it/dettaglio.do?sort=*RICOVIAGGI*&codAgenzia=" + "#{ ag }" 
    doc = Nokogiri::HTML(open(url)) 
    aFile=File.open('data.txt', 'a') 
    aFile.write(doc.at_css("table").text) 
    aFile.close 
    end 

¿Tiene algunas ideas para resolverlo? Gracias!

aS

Respuesta

3

, deja que limpiarlo para usted:

File.open('data.txt', 'w') do |aFile| 
    (1..40).each do |ag| 
    url = "http://www.infotrav.it/dettaglio.do?sort=*RICOVIAGGI*&codAgenzia=#{ag}" 
    response = open(url) rescue nil 
    next unless response 
    doc = Nokogiri::HTML(response) 
    aFile << doc.at_css("table").text 
    end 
end 

notas:

  • usando estilo de bloque File.open significa que el archivo se cerrará cuando el bloque sale
  • uso cada uno para iterar en lugar de for loop
+0

Gracias Soy un novato en rubí ... – jackkkk

3

si no puede solucionar el problema en el servidor remoto, trata de rescatar del error y continuar el desguace:

begin 
    doc = Nokogiri::HTML(open(url)) 
    aFile=File.open('data.txt', 'a') 
    aFile.write(doc.at_css("table").text) 
    aFile.close 
rescue => e 
    puts e.message 
end 
4

El código tiene un error menor. Debe ser ag = ag + 1 y no agenzie = ag + 1. Supongo que sucedió mientras copiaba el código a stackoverflow, ya que el código no habría funcionado con el error tipográfico.

Pude ejecutar el código localmente y obtuve el mismo error. Resulta que url being accessed (cuando codAgenzia = 30) no está disponible en el sitio http://www.infotrav.it; devuelve un error HTTP 500.

Así que el problema no es con su código, pero con el servidor remoto (http://www.infotrav.it)

Como slivu mencionado en su respuesta, que debe rescatar el error y continuar raspado.

+0

Prakash, ahora entiendo ... problema es que el servidor en htt p: //www.infotrav.it/dettaglio.do? sort =% 2aRICOVIAGGI% 2a & codAgenzia = 30 ¡recupera algún error! Gracias! – jackkkk

+0

¡De nada! No olvide marcar la respuesta como aceptada. –

Cuestiones relacionadas