2012-04-16 45 views
0

我試圖建立一個網絡爬蟲並遇到了一點障礙。基本上我在做的是從網頁中提取鏈接並將每個鏈接推送到隊列中。每當Ruby解釋器命中的這部分代碼:紅寶石EOFError與開放的uri和循環

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

我收到以下錯誤:

/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) 

如果我註釋掉的代碼塊以上我沒有得到任何錯誤。請,任何幫助,將不勝感激。這裏是其餘的代碼:

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 

回答

0

我遇到了同樣的錯誤,但與Watir的webdriver,在無頭模式下運行firefox。我發現的是,如果我並行運行兩個應用程序,並且在某個應用程序中摧毀了「無頭」應用程序,它會自動殺死另一個應用程序以及您引用的確切錯誤。儘管我的情況與您的情況並不相同,但我認爲該問題與您的應用程序仍在使用時過早關閉外部文件句柄有關。我從應用程序中刪除了destroy命令,錯誤消失了。

希望這會有所幫助。