Mechanize脚本使用`fetch'保持停止:503 =>网:: HTTPServiceUnavailable

时间:2013-07-11 00:04:21

标签: 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 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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我首先怀疑您违反了网站的服务条款(TOS)和/或robots.txt文件,他们的系统暂时禁止您。

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

尝试一次阅读1500页,如果没有与他们达成协议,那就没关系,这将是一个非常明显的解雇和掠夺行动,所以不要那么努力。请记住,这也是他们的带宽和CPU。继续用力打他们,他们可能永久禁止你,这不是你想要的。

答案 2 :(得分:0)

可能是服务器响应时间延迟或没有响应您的解析请求,这意味着捕获错误可能有助于继续您的请求。之前我遇到过类似的问题并使用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.write Rails.cache.read 来存储和读取数据。