Ruby 在手动结束脚本之前,Mechanize如何保持会话?

Ruby 在手动结束脚本之前,Mechanize如何保持会话?,ruby,session,mechanize,Ruby,Session,Mechanize,有一个网页,我需要在我的整个工作日打开。我使用Mechanize在Ruby中编写了一个脚本,该脚本运行良好,但是,当脚本结束时,页面将关闭 我发现了一种使用无止境循环和睡眠(x)的方法,但我仍然认为这不是一种好方法。恐怕这会占用太多的内存 在手动结束脚本之前,是否有任何方法保持会话打开 这是我的密码: require 'rubygems' require 'mechanize' def autoOpen (loginname, loginpasswd) p = Mechanize.ne

有一个网页,我需要在我的整个工作日打开。我使用Mechanize在Ruby中编写了一个脚本,该脚本运行良好,但是,当脚本结束时,页面将关闭

我发现了一种使用无止境循环和睡眠(x)的方法,但我仍然认为这不是一种好方法。恐怕这会占用太多的内存

在手动结束脚本之前,是否有任何方法保持会话打开

这是我的密码:

require 'rubygems'
require 'mechanize'

def autoOpen (loginname, loginpasswd)
    p = Mechanize.new
    p.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    page = p.get('https://www.webpage.com/index.cgi')
    logpage = page.form_with(:method => "POST")
    logpage.username = loginname
    logpage.password = loginpasswd
    succpage = logpage.submit(logpage.button_with(:name => 'Submit'))
end

while 1 == 1
    if false == system('ping www.webpage.com > tmp')
        autoOpen('username', 'password')
    end
    sleep(1)
end
实际上,即使我添加了无止境的循环,它也不会起作用

正如@theTinMan所说,Mechanize只是打开页面并获取内容/对象,它不能停留在页面中


有解决方案吗?

您可以尝试使用打开浏览器窗口

瓦蒂尔不像机械化;Mechanize是一个页面解析器,它允许您填写表单并提交表单,并且作为一个辅助功能,可以通过页面的DOM查找内容

相反,Watir告诉浏览器如何像用户一样工作,因此打开页面、单击按钮、获取字段内容或在字段中输入文本都是可行的。这可能会欺骗您的代理系统,使其认为您实际上正在使用该页面

但是,真的,我认为你正在试图破解一个可能会让你大吃一惊的系统。如果我写了一个代理,我会观察会话是否有流量通过。如果没有,我会把它关上。代理服务器是网络服务器,资源也很有限,所以如果有很多人打开了会话却没有使用它,那么这些资源就被浪费了。因此,如果仅仅打开一个浏览器页面并不是真正的解决办法,也不要感到惊讶

相反,您可能需要进一步了解该特定代理,看看是否可以通过它打开一个隧道,并通过ping或定期向远程主机请求来保持该隧道的打开

再说一次,你告诉我们的还不足以给你任何有用的答案。听起来你对你试图愚弄的代理还不够了解,所以你的未来会有很多实验

作为Ruby编码技巧,我会将您的代码编写为:

require 'rubygems'
require 'mechanize'

def auto_open(name, password)
  p = Mechanize.new
  p.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  logpage = p.get('https://www.webpage.com/index.cgi').form_with(:method => "POST")
  logpage.username = name
  logpage.password = password
  logpage.submit(logpage.button_with(:name => 'Submit'))
end

while true
  if system('ping -c1 www.webpage.com > /dev/null')
    sleep(1)
  else
    auto_open('username', 'password')
  end
end
该代码仍然无法工作,但它更像Ruby


另外,您可能想看看如何使用
ping-i60 www.webpage.com>/dev/null
<代码>-i n表示“等待
n
两次ping之间的秒数”。

您所说的“网页需要打开”是什么意思?Mechanize只读取一次页面,但不会保持打开状态。它临时缓存它读取的内容,以便您可以在页面中找到元素,但它不是浏览器,也不像浏览器。这根本不占用太多内存:
loop.do{sleep x}
。也许你应该展示一些代码。嗨@theTinMan,这意味着,有一个代理(代理是一个网页),我需要每天在浏览器中打开它。谢谢你的解释,有什么方法可以保存会话吗?嗨@pguardiario,我已经展示了代码,但是循环无法工作,因为Mechanize不能停留在该页面中。如果你每次都创建一个新的Mechanize对象,你的会话将不会“保持活动”。我希望我能帮上更多的忙,但你似乎也对ruby的工作原理缺乏基本的了解。你真好,theTinMan,我是一个完全新鲜的人。谢谢你这么耐心的讲解。