使用ruby的open-uri访问特定站点时出现503错误

Yir*_* Lu 1 ruby open-uri http web-crawler http-status-code-503

我一直在使用下面的代码来抓取一个网站,但我想我可能已经抓了太多,并且完全被禁止访问该网站.在,我仍然可以在我的浏览器上访问该站点,但任何涉及open-uri和此站点的代码都会引发503站点不可用错误.我认为这是特定于网站的,因为open-uri仍然适用于google和facebook.这有解决方法吗?

require 'rubygems'
require 'hpricot'
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open("http://www.quora.com/What-is-the-best-way-to-get-ove$

topic = doc.at('span a.topic_name span').content
puts topic
Run Code Online (Sandbox Code Playgroud)

the*_*Man 5

有解决方法,但最好的想法是根据他们的条件成为一个好公民.您可能需要确认您是否遵守其服务条款:

如果您操作搜索引擎或机器人,或者您重新发布所有Quora内容的很大一部分(我们可以根据我们的合理判断确定),您还必须遵循以下规则:

  • 您必须使用描述性用户代理标头.
  • 您必须始终关注robots.txt.
  • 您必须明确说明如何通过用户代理字符串或您的网站(如果有)与您联系.

您可以使用OpenURI轻松设置用户代理标头:

Additional header fields can be specified by an optional hash argument.

  open("http://www.ruby-lang.org/en/",
    "User-Agent" => "Ruby/#{RUBY_VERSION}",
    "From" => "foo@bar.invalid",
    "Referer" => "http://www.ruby-lang.org/") {|f|
    # ...
  }
Run Code Online (Sandbox Code Playgroud)

可以从中检索Robots.txt http://www.quora.com/robots.txt.你需要解析它并尊重它的设置,否则它们会再次禁止你.

此外,您可能希望通过在循环之间休眠来限制代码的速度.

此外,如果您要为其内容搜索其网站,您可能希望在本地查看缓存页面,或使用其中一个spidering包.写蜘蛛很容易.写一个与网站很好地合作的工作要做得更多,但要比不能自己蜘蛛网站更好.