2013-02-26 21 views
1

我整個工作日都需要打開一個網頁。我使用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所說,機械化只是打開頁面並獲取內容/對象,它不能在頁面中停留

有沒有解決方案?

+0

「網頁需要打開」是什麼意思?機械化一次讀取頁面,並不保持打開狀態。它暫時緩存它所讀取的內容,因此您可以在頁面中找到元素,但它不是瀏覽器,也不像一個。 – 2013-02-26 06:30:26

+0

這根本不佔用太多內存:'loop.do {sleep x}'。也許你應該展示一些代碼。 – pguardiario 2013-02-26 06:48:10

+0

嗨@theTinMan這意味着,有一個代理(代理是一個網頁),我需要每天在瀏覽器中打開它。感謝您的解釋,是否有任何方法可以**持續**會議? – Marslo 2013-02-26 10:20:35

回答

3

您可以嘗試的一件事是使用Watir來打開瀏覽器窗口。 Watir並不像機械化; 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 

該代碼仍然無法工作,但它更紅寶石般。

此外,你可能想看看使用ping -i 60 www.webpage.com > /dev/null-i n的意思是「在ping之間等待n秒」。

+0

你真好,@TheTinMan,我是一個全新的。感謝你耐心的說明。 – Marslo 2013-02-27 02:25:03

+0

+1對於'Watir'建議 – 2013-05-22 05:50:22