2012-10-04 14 views
5

Próbuję kodować proste skrobanie w Internecie w ruby. Działa do 29 url następnie otrzymuję komunikat o błędzie:RUBY - skrobanie w Internecie - (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>' 

Mój kod:

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 

Czy masz jakieś pomysły, aby go rozwiązać? Dzięki!

aS

Odpowiedz

3

Pozwól, oczyścić go dla ciebie:

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 

Uwagi:

  • stosując styl blok File.open oznacza plik zamknie się, gdy blok wychodzi
  • korzystania każdy do iteracji zamiast do pętli
+0

Dzięki, jestem nowicjuszem w rubinach ... – jackkkk

3

jeśli nie uda się rozwiązać problemu na zdalnym serwerze, starają się uratować od błędu i kontynuować złomowania:

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

Kod ma niewielką literówkę. Powinien to być ag = ag + 1, a nie agenzie = ag + 1. Zakładam, że zdarzyło się, że skopiowałeś kod do stackoverflow, ponieważ kod nie działałby z literówką.

Udało mi się uruchomić kod lokalnie i otrzymałem ten sam błąd. Okazuje się, że url being accessed (gdy codAgenzia = 30) nie jest dostępny na stronie http://www.infotrav.it; zwraca błąd HTTP 500.

Tak więc problem nie jest w kodzie, ale z serwera zdalnego (http://www.infotrav.it)

Jak slivu mowa w swojej odpowiedzi, należy ratować błąd i kontynuować skrobanie.

+0

Prakash, teraz rozumiem .. problem polega na tym, że serwer na htt p: //www.infotrav.it/dettaglio.do? sort =% 2aRICOVIAGGI% 2a & codAgenzia = 30 odzyskać błąd! Dzięki! – jackkkk

+0

Nie ma za co! Nie zapomnij oznaczyć odpowiedzi jako zaakceptowanej. –