1

我正在尝试使用 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
4

3 回答 3

2

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

于 2013-07-11T01:34:13.307 回答
2

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

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

尝试一次阅读 1500 页,但没有与他们达成一致同意,这将是一个非常明显的抢劫和掠夺,所以不要对他们施加如此大的打击。请记住,您还需要访问他们的带宽和 CPU。继续用力打击他们,他们可能会永久禁止您,这不是您想要的。

于 2013-07-11T08:11:01.990 回答
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.writeRails.cache.read来存储和读取数据。

于 2013-07-11T10:51:22.350 回答