Ruby Mechanize脚本一直使用“fetch';”停止:503=>;Net::HTTPServiceUnavailable

Ruby Mechanize脚本一直使用“fetch';”停止:503=>;Net::HTTPServiceUnavailable,ruby,timeout,nokogiri,mechanize,net-http,Ruby,Timeout,Nokogiri,Mechanize,Net Http,我正在尝试使用Mechanize运行一个本地Ruby脚本,该脚本将我登录到一个网站上,浏览其大约1500个网页并解析每个网页的信息。解析是有效的,但只在一定的时间内有效;脚本运行约45秒,然后完全停止并报告: /Users/myname/.rvm/gems/ruby-1.9.3-p374/gems/mechanize-2.7.1/lib/mechanize/http/agent.rb:306:in `fetch': 503 => Net::HTTPServiceUnavailable fo

我正在尝试使用Mechanize运行一个本地Ruby脚本,该脚本将我登录到一个网站上,浏览其大约1500个网页并解析每个网页的信息。解析是有效的,但只在一定的时间内有效;脚本运行约45秒,然后完全停止并报告:

/Users/myname/.rvm/gems/ruby-1.9.3-p374/gems/mechanize-2.7.1/lib/mechanize/http/agent.rb:306:in `fetch': 503 => Net::HTTPServiceUnavailable for http://example.com/page;53 -- unhandled response (Mechanize::ResponseCodeError)
我不能确定,但我觉得这可能是由于连接超时。我尝试在我的脚本中用很长的超时时间来解决这个问题(这个脚本可能需要15分钟才能运行),但它仍然没有改变任何事情。如果你有任何想法,请告诉我

这是我的剧本:

require 'mechanize'
require 'open-uri'
require 'rubygems'

agent = Mechanize.new 
agent.open_timeout   = 1000
agent.read_timeout   = 1000
agent.max_history = 1

page = agent.get('examplesite.com')

myform = page.form_with(:action => '/maint')

myuserid_field = myform.field_with(:id => "username")
myuserid_field.value = 'myusername'  
mypass_field = myform.field_with(:id => "password")
mypass_field.value = 'mypassword' 

page = agent.submit(myform, myform.buttons.first)

urlArray = [giant array of webpages here]

urlArray.each do |term|
    page = agent.get('' + term + '')
    page.encoding = 'windows-1252'
    puts agent.page.parser.xpath("//tr[4]/td[2]/textarea/text()").text + 'NEWLINEHERE'
end

尝试在每个循环中调用
sleep(1)
。目标服务器很可能被所有的请求淹没,没有任何停顿。

尝试在每个循环中调用
sleep(1)
。目标服务器很可能被所有的请求淹没,没有任何停顿。

我的第一个怀疑是你违反了网站的服务条款(TOS)和/或他们的robots.txt文件,他们的系统暂时禁止你

全速运行蜘蛛或爬虫程序并不是一个好的网络公民,所以搜索他们的TOS并学习如何加载和解析robots.txt文件以按照他们的规则进行游戏。Mechanize知道如何处理robots.txt文件,但必须使用


在没有与他们达成协议的情况下,试图一次阅读1500页,这将是一个相当明显的抢劫行为,所以不要对他们太严厉。记住,你也要考虑他们的带宽和CPU。继续严厉打击他们,他们可能会永久禁止你,这不是你想要的。

我的第一个怀疑是你违反了网站的服务条款(TOS)和/或他们的robots.txt文件,他们的系统暂时禁止你

全速运行蜘蛛或爬虫程序并不是一个好的网络公民,所以搜索他们的TOS并学习如何加载和解析robots.txt文件以按照他们的规则进行游戏。Mechanize知道如何处理robots.txt文件,但必须使用


在没有与他们达成协议的情况下,试图一次阅读1500页,这将是一个相当明显的抢劫行为,所以不要对他们太严厉。记住,你也要考虑他们的带宽和CPU。继续猛烈攻击他们,他们可能会永久禁止您,这不是您想要的。

可能是服务器响应时间延迟或没有响应您的解析请求,这意味着捕获错误可能有助于继续您的请求。我以前也遇到过类似的问题,并使用TimeoutError解决了它。您可能希望这样实现它

begin
  status=Timeout.timeout(5){
    #Interrupts if it takes more than 5 secs
  }
rescue Timeout::Error
  #Should read the data from time-out and carry on where it was left off.
end

您可能需要使用Rails.cache.writeRails.cache.read来存储和读取数据

可能是服务器响应时间延迟或没有响应您的解析请求,这意味着捕获错误可能有助于继续您的请求。我以前也遇到过类似的问题,并使用TimeoutError解决了它。您可能希望这样实现它

begin
  status=Timeout.timeout(5){
    #Interrupts if it takes more than 5 secs
  }
rescue Timeout::Error
  #Should read the data from time-out and carry on where it was left off.
end

您可能需要使用Rails.cache.writeRails.cache.read来存储和读取数据

这就是我需要使用的代码。然而,我考虑到锡人的意见,我应该检查网站的robot.txt文件。我做到了,它说它将网络爬虫的请求限制在每次至少10秒。因此,我将
sleep 10.1
(只是为了安全起见)输入到我的
每个
循环中,它工作得非常好。这意味着脚本将需要大约4个小时才能运行,但我没意见。这是我第一次启动如此大的请求,所以我没有意识到它会给服务器带来的负担的重要性,也没有意识到如何降低请求的速度,正如您在这里指出的。我尝试了几种睡眠选项,最后确定1是最佳选项。这是我需要使用的代码。然而,我考虑到锡人的意见,我应该检查网站的robot.txt文件。我做到了,它说它将网络爬虫的请求限制在每次至少10秒。因此,我将
sleep 10.1
(只是为了安全起见)输入到我的
每个
循环中,它工作得非常好。这意味着脚本将需要大约4个小时才能运行,但我没意见。这是我第一次启动如此大的请求,所以我没有意识到它会给服务器带来的负担的重要性,也没有意识到如何降低请求的速度,正如您在这里指出的。我尝试了几种睡眠选项,最后确定1是最佳选项。谢谢,Tin Man。这是我第一次在服务器上输入如此大的请求,但我不知道如何降低速度(我最终使用
sleep
)。这本书读起来真的很有帮助。谢谢,锡人。这是我第一次在服务器上输入如此大的请求,但我不知道如何降低速度(我最终使用
sleep
)。这本书读起来真的很有帮助。