At some point you will find that you have reached requests per IP limit while using some API or crawling resources. And if you`re doing it via standard Net::HTTP you`ll face the problem that you cannot assign request class to specified network interface (or IP). Bummer? No. Even if you cant do it with core class you might take a look on Curb – libcurl ruby binding. It has everything that you need to make regular get/post/etc requests. And of course – easy.
A simple example (real ip`s are changed):
require 'rubygems' require 'curb' ip_addresses = [ '1.1.1.1', '2.2.2.2', '3.3.3.3', '4.4.4.4', '5.5.5.5' ] ip_addresses.each do |ip| req = Curl::Easy.new('http://www.ip-adress.com/') req.interface = ip req.perform result_ip = req.body_str.scan(/<h2>My IP address is: ([\d\.]{1,})<\/h2>/).first puts("for #{ip} got response: #{result_ip}") end
Output (ip`s are changed):
for 1.1.1.1 got response: 1.1.1.1 for 2.2.2.2 got response: 2.2.2.2 for 3.3.3.3 got response: 3.3.3.3 for 4.4.4.4 got response: 4.4.4.4 for 5.5.5.5 got response: 5.5.5.5
At least its working. Havent done any performance tests.
Sample on pastie: http://pastie.org/private/afxlcuk1npwjov3wer5hw