【问题标题】:How to bypass network errors while using Ruby Mechanize web crawling如何在使用 Ruby Mechanize 网络爬虫时绕过网络错误
【发布时间】:2018-08-01 05:27:47
【问题描述】:

我正在使用 Ruby 机械化网络爬虫从流行的房地产网站中提取数据。我使用家庭住址作为关键字来抓取 Zillow、Redfin 等上的公共数据。 我基本上是在尝试绕过任何 HTTP 和网络错误。以下救援功能似乎无法完成这项工作。

def scrape_single(key_word)
    #setup agent
    agent = Mechanize.new{ |agent|
        agent.user_agent_alias = 'Mac Safari'
    }
    agent.ignore_bad_chunking = true
    agent.verify_mode = OpenSSL::SSL::VERIFY_NONE 
    agent.request_headers = { "Accept-Encoding" => ""}
    agent.follow_meta_refresh = true
    agent.keep_alive = false

    #page setup
    begin
      agent.get(@@search_engine) do |page|
        @@search_result = page.form('f') do |search|
          search.q = key_word
        end.submit
      end 
    rescue Timeout::Error
      puts "Timeout"
      retry
    rescue Net::HTTPGatewayTimeOut => e
      if e.response_code == '504' || '502'
        e.skip
        sleep 5
      end
    rescue Net::HTTPBadGateway  => e
      if e.response_code == '504' || '502'
        e.skip
        sleep 5
      end
    rescue Net::HTTPNotFound => e
      if e.response_code == '404'
        e.skip
        sleep 5
      end
    rescue Net::HTTPFatalError => e
      if e.response_code == '503'
        e.skip
      end
    rescue Mechanize::ResponseCodeError => e
      if e.response_code == '404'
        e.skip
        sleep 5
      elsif e.response_code == '502'
        e.skip
        sleep 5
      else
        retry
      end
    rescue Errno::ETIMEDOUT
      retry
    end

    return @@search_result      # returns Mechanize::Page
  end 

以下是我收到的一个错误消息示例,该错误消息是针对具有 MA 的地址的关键字。

/home/ec2-user/.gem/ruby/2.1/gems/mechanize-2.7.5/lib/mechanize/http/agent.rb:323:in `fetch': 404 => Net::HTTPNotFound for https://www.redfin.com/MA/WASHINGTON/306-WERDEN-RD-Unknown/home/134059623 -- 未处理的响应 (Mechanize::ResponseCodeError)

您输入上述网址时看到的实际信息是:

无法获取 /MA/WASHINGTON/306-WERDEN-RD-Unknown/home/134059623

我的目标是简单地忽略并跳过零星的错误并转到下一个关键字。我真的无法在网上找到一个可行的解决方案,任何反馈都将不胜感激。

【问题讨论】:

  • 老实说,这些网站中的任何一个都会在前 50 个左右的请求之后开始发送 403,所以你遇到的问题比你想象的要大得多。
  • pguardiario 你认为有办法忽略 403 之类的吗??
  • 403 表示您已被屏蔽。忽略它有什么好处?

标签: ruby web-crawler mechanize rescue


【解决方案1】:

如果我理解引发的错误是 Mechanize::ResponseCodeError,这显然是一个 404 response_code。但是在您的脚本中,您不会从 Mechanize::ResponseCodeError

引发 404 response_code
all_response_code = ['403', '404', '502']

rescue Mechanize::ResponseCodeError => e
  if all_response_code.include? response_code 
    e.skip
    sleep 5
  else
    retry
  end

也许如果你为 404 response_code 添加一个条件,它就可以解决问题

编辑 我稍微更改了代码以减少行数

【讨论】:

  • Makushimaru 非常感谢您的反馈。缩短版肯定看起来好多了。实际上,我确实为Mechanize::ResponseCodeError 提供了 404 救援。我截断了原始代码并忘记添加它。不知何故,它从未成功跳过错误。 e.skip 实际上并没有按照我的预期去做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多