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

时间:2013-02-26 06:00:09

标签: ruby session mechanize

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

我找到了一个使用无限循环和sleep(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只是打开页面并获取内容/对象,它不能保持在页面中。

有解决方案吗?

1 个答案:

答案 0 :(得分:3)

您可以尝试的一件事是使用Watir打开浏览器窗口。

Watir不像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 -i 60 www.webpage.com > /dev/null-i n表示“在ping之间等待n秒”。