2011-06-09 61 views
8

我正在寫一個Ruby腳本,它會自動抓取網站進行數據分析,現在我有一個相當複雜的要求:我必須能夠模擬來自各種國家的訪問,大約20個不同的國家那些。該網站將根據IP位置包含不同的信息,因此完成該操作的唯一方法是從實際在該國家的服務器請求該信息。用Ruby控制Tor客戶端

因爲我不想在這20個國家的每一個國家購買服務器,所以我選擇給Tor一個嘗試 - 就像你們許多人所知道的那樣,通過編輯torrc配置文件,可以指定出口節點和因此實際請求將從哪個國家發起。

手動操作時,例如通過編輯torrc文件使用阿根廷服務器,然後使用Vidalia斷開Tor,重新連接Vidalia,然後重新運行請求,它工作正常。不過,我想完全自動化這個過程,並儘可能高效地完成此過程。 Tor是用C語言編寫的,我想避免把它的整個源代碼分解出來。想知道什麼是僅使用Ruby自動化整個過程的最簡單方法?另外,如果我錯過了一些東西,並且這個整個考驗有一個更簡單的選擇,請告訴我。

謝謝!

回答

12

請看看Tor控制協議。您可以使用telnet控制電路。 http://thesprawl.org/memdump/?entry=8

要切換到新的電路至極切換到新的端點:

require 'net/telnet' 

    def switch_endpoint 
    localhost = Net::Telnet::new("Host" => "localhost", "Port" => "9051", "Timeout" => 10, "Prompt" => /250 OK\n/) 
    localhost.cmd('AUTHENTICATE ""') { |c| print c; throw "Cannot authenticate to Tor" if c != "250 OK\n" } 
    localhost.cmd('signal NEWNYM') { |c| print c; throw "Cannot switch Tor to new route" if c != "250 OK\n" } 
    localhost.close 
    end 

注意的延遲,使新的電路,可能需要幾秒鐘,所以你最好添加一個延遲在代碼中,或通過調用某個遠程IP檢測站點來檢查您的地址是否已更改。