我整个工作日都需要打开一个网页。我使用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只是打开页面并获取内容/对象,它不能保持在页面中。
有解决方案吗?
答案 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
秒”。