据我所知,你可以在ruby Net :: HTTP中使用proxy。但是,我不知道如何使用一堆代理执行此操作。我需要Net :: HTTP更改为另一个代理,并在每个帖子请求后发送另一个帖子请求。此外,如果以前的代理不工作,是否可以使Net :: HTTP更改为另一个代理?如果是这样,怎么样? 代码I尝试在以下位置实现脚本:
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 :(得分:0)
给定一个代理数组,以下示例将通过数组中的每个代理发出请求,直到它收到" 302 Found"响应。 (这实际上并不是一个有效的例子,因为Google不接受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"
的行 - 程序将因某种类型的连接超时错误而失败。
有关可用于自定义Net::HTTP::Post
对象的其他方法,请参阅the Net::HTTPHeader docs。