【发布时间】: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