【问题标题】:RUBY - web scraping - (OpenURI::HTTPError)RUBY - 网页抓取 - (OpenURI::HTTPError)
【发布时间】:2012-09-26 00:23:53
【问题描述】:

我正在尝试用 ruby​​ 编写一个简单的网络抓取代码。 它工作到第 29 个 url 然后我收到此错误消息:

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>'

我的代码:

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

你有什么想法可以解决吗? 谢谢!

aS

【问题讨论】:

    标签: ruby web web-scraping


    【解决方案1】:

    来,我帮你清理一下:

    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
    

    注释:

    • 使用块样式 File.open 意味着文件将在 阻止退出
    • 使用 each 来迭代而不是 for 循环

    【讨论】:

      【解决方案2】:

      代码有一个小错误。它应该是ag = ag + 1 而不是agenzie = ag + 1。我假设您将代码复制到 stackoverflow 时发生了这种情况,因为代码无法处理错字。

      我能够在本地运行代码,但得到了同样的错误。原来url being accessed(当 codAgenzia=30 时)在http://www.infotrav.it 网站上不可用;它返回一个 HTTP 错误 500。

      所以问题不在于您的代码,而在于远程服务器(http://www.infotrav.it

      正如 slivu 在他的回答中提到的,您应该挽救错误并继续抓取。

      【讨论】:

      • Prakash,现在我明白了.. 问题是infotrav.it/… 上的服务器检索到一些错误!谢谢!
      【解决方案3】:

      如果您无法修复远程服务器上的问题,请尝试从错误中挽救并继续报废:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-27
        • 2023-03-15
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        相关资源
        最近更新 更多