2012-04-16 2 views
0

Je tente de construire un robot d'indexation Web et s'est heurté à un peu d'un problème. Fondamentalement, ce que je fais est d'extraire les liens d'une page Web et de pousser chaque lien vers une file d'attente. Chaque fois que les hits Ruby interprète cette section du code:Ruby EOFError avec open-uri et la boucle

links.each do |link| 
    url_frontier.push(link) 
end 

Je reçois l'erreur suivante:

/home/blah/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/protocol.rb:141:in `read_nonblock': end of file reached (EOFError) 

Si je commente le bloc au-dessus d'un code je reçois aucune erreur. S'il vous plaît, toute aide serait appréciée. Voici le reste du code:

require 'open-uri' 
require 'net/http' 
require 'uri' 

class WebCrawler 
    def self.Spider(root) 
    eNDCHARS = %{.,'?!:;} 
    num_documents = 0 
    token_list = [] 
    url_repository = Hash.new 
    url_frontier = Queue.new 

    url_frontier.push(root.to_s) 
    while !url_frontier.empty? && num_documents < 10 
    url = url_frontier.pop 
     if !url_repository.has_key?(url) 
     document = open(url) 
     html = document.read 

     # extract url's 
     links = URI.extract(html, ['http']).collect { |u| eNDCHARS.index(u[-1]) ? u.chop : u } 

     links.each do |link| 
      url_frontier.push(link) 
     end 

     # tokenize 
     Tokenizer.tokenize(document).each do |word| 
      token_list.push(IndexStructures::Term.new(word, url)) 
     end 

     # add to the repository 
     url_repository[url] = true 
     num_documents += 1 
     end 
    end 

    # sort by term (primary) and document id (secondary) in reverse to aid in the construction of the inverted index 
    return num_documents, token_list.sort_by! { |term| [term.term, term.document_id]}.reverse! 
    end 
end 

Répondre

0

j'ai rencontré la même erreur, mais avec Watir-WebDriver, en cours d'exécution en mode sans tête firefox. Ce que j'ai découvert, c'est que si je courais deux de mes applications en parallèle et que je détruisais «sans tête» dans l'une des applications, il tue automatiquement l'autre avec l'erreur exacte que vous avez citée. Bien que ma situation ne soit pas la même que la vôtre, je pense que le problème est lié à la fermeture prématurée de la poignée de fichier à l'extérieur pendant que votre application l'utilise encore. J'ai supprimé la commande destroy de mon application et l'erreur a disparu.

Espérons que cela aide.

Questions connexes