کاندیداهای پروکسی را با کلاینتهای جداگانه Ruby Net::HTTP امتحان کنید
برای هر کاندیدای پروکسی یک نمونه Net::HTTP بسازید و بر اساس پاسخی که عملیات شما واقعاً لازم دارد متوقف شوید.
فهرست پروکسی تنها زمانی مفید میشود که هر تلاش کلاینتی متناسب با همان نقطه پایانی بسازد. برای یک GET از طریق پروکسیهای HTTP بدون احراز هویت، Net::HTTP را میتوان چنین به کار برد:
require 'net/http'
uri = URI('https://www.example.com/status')
proxies = ['http://proxy-a.example:8080',
'http://proxy-b.example:8080']
proxies.each do |value|
proxy = URI(value)
http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port)
http.use_ssl = uri.scheme == 'https'
http.open_timeout = 5
http.read_timeout = 10
begin
response = http.get(uri.request_uri)
puts "#{proxy.host}:#{proxy.port} #{response.code}"
break if response.is_a?(Net::HTTPSuccess)
rescue Net::OpenTimeout, Net::ReadTimeout, SocketError, SystemCallError, IOError => error
warn "#{proxy.host}:#{proxy.port} #{error.class}"
end
endآرگومان چهارم پورت پروکسی را انتخاب میکند؛ uri.host و uri.port همچنان مقصد را مشخص میکنند. دو ورودی نمونه را از فهرست پروکسی HTTP پر کنید هنگامی که یک نشانی عمومی مجاز را از طریق نقاط پایانی HTTP بدون احراز هویت بررسی میکنید. request_uri مسیر و پرسوجوی خود را حفظ میکند. نمونه خطاهای معمول اتصال و خواندن را مدیریت میکند و در صورت رسیدن، وضعیت HTTP را ثبت میکند.
اینجا هر پاسخ 2xx جستوجو را پایان میدهد. اگر عملیات شما نتیجه دیگری انتظار دارد، آن معیار را صریح تعریف کنید. یک تغییر مسیر بهطور خودکار ثابت نمیکند که صفحه مورد نظر دریافت شده است.
تکرار خودکار را متناسب با متد نگه دارید. یک POST که پس از ارسال بدنهاش زمانسنجی میشود ممکن است برنامه راه دور را از قبل تغییر داده باشد؛ تلاش دوباره از طریق پروکسی دیگر میتواند همان اثر را تکرار کند. نمونه GET بازپخش ایمن تراکنشهای دلخواه را وعده نمیدهد.