2014-10-06 17 views
0

我知道您可以在ruby Net :: HTTP中使用代理。但是,我不知道如何用一堆代理來做到這一點。我需要Net :: HTTP更改爲另一個代理,並在每次發佈請求後發送另一個發佈請求。另外,如果以前的代理不工作,是否有可能使Net :: HTTP更改爲另一個代理?如果是這樣,怎麼樣? 代碼我試圖實現在腳本:Net :: HTTP代理列表

require 'net/http' 
sleep(8) 
http = Net::HTTP.new('URLHERE', 80) 
http.read_timeout = 5000 
http.use_ssl = false 
path = 'PATHHERE' 
data = '(DATAHERE)' 
headers = { 
'Referer' => 'REFERER HERE', 
'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', 
'User-Agent' => '(USERAGENTHERE)'} 

resp, data = http.post(path, data, headers) 


# Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page 
puts 'Code = ' + resp.code 
puts 'Message = ' + resp.message 
resp.each {|key, val| puts key + ' = ' + val} 
puts data 

+0

您是否能夠使用一個代理工作?如果是這樣,你會發布代碼嗎? – thohl 2014-10-06 15:39:33

+0

我一直未能成功實現代理。 – 2014-10-07 04:24:24

回答

0

鑑於代理的陣列,直到它接收到發現一個「302的下面的例子將通過使陣列中的每個代理的請求「迴應。 (這是不實際工作的例子,因爲谷歌不接受POST請求,但如果你插入自己的目標和工作代理它應該工作。)

require 'net/http' 

destination = URI.parse "http://www.google.com/search" 
proxies = [ 
    "http://proxy-example-1.net:8080", 
    "http://proxy-example-2.net:8080", 
    "http://proxy-example-3.net:8080" 
] 

# Create your POST request_object once 
request_object = Net::HTTP::Post.new(destination.request_uri) 
request_object.set_form_data({"q" => "stack overflow"}) 

proxies.each do |raw_proxy| 

    proxy = URI.parse raw_proxy 

    # Create a new http_object for each new proxy 
    http_object = Net::HTTP.new(destination.host, destination.port, proxy.host, proxy.port) 

    # Make the request 
    response = http_object.request(request_object) 

    # If we get a 302, report it and break 
    if response.code == "302" 
     puts "#{proxy.host}:#{proxy.port} responded with #{response.code} #{response.message}" 
     break 
    end 
end 

你也可能應該做一些誤差begin ... rescue ... end檢查每次你提出請求。如果您沒有進行任何錯誤檢查並且代理已關閉,則控制將永遠不會到達檢查response.code == "302"的線路 - 程序將因某種類型的連接超時錯誤而失敗。

請參閱the Net::HTTPHeader docs其他可用於定製對象的方法。