我正在尝试使用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
答案 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 来存储和读取数据。