파서를 작성하거나 외부 API를 통합하거나 루비에서 데이터 수집을 자동화하는 경우 - 언젠가는 IP 차단에 직면하게 됩니다. Wildberries, Ozon, Instagram 및 기타 수십 개의 서비스는 몇 백 번의 요청 후에 하나의 주소에서 오는 요청을 차단합니다. 해결책은 하나입니다 - 프록시입니다. 이 기사에서는 표준 Net::HTTP 및 인기 있는 HTTP 클라이언트 Faraday를 통해 루비 프로젝트에 프록시를 연결하는 방법, IP 회전 설정 및 오류를 올바르게 처리하는 방법을 다룰 것입니다 - Rails 애플리케이션과 간단한 스크립트 모두에서.
루비 개발자에게 프록시가 필요한 이유: 주요 시나리오
루비는 프록시 없이는 해결할 수 없는 작업에 자주 사용됩니다. 코드를 작성하기 전에 프록시가 필요한 상황을 이해하는 것이 중요합니다. 이는 올바른 유형과 아키텍처를 선택하는 데 도움이 됩니다.
파싱 및 데이터 수집. 가장 일반적인 시나리오입니다. Wildberries, Ozon 또는 Avito 페이지를 탐색하고 상품의 가격과 특성을 수집하는 루비 스크립트를 작성하고 있습니다. 프록시 없이 이러한 스크립트는 몇 분 만에 IP로 차단됩니다. 사이트는 하나의 주소에서 오는 수백 개의 요청을 감지하고 자동으로 보호 기능을 활성화합니다 - CAPTCHA, 임시 차단 또는 서비스 거부.
지리적 API와의 통합. 일부 외부 서비스는 요청하는 국가에 따라 다른 콘텐츠를 반환합니다. 귀하의 Rails 애플리케이션이 이러한 API에 접근할 경우, 프록시는 필요한 지역에서 요청을 모방할 수 있게 해줍니다. 예를 들어, 다양한 국가에 대한 검색 엔진 결과를 확인하거나 특정 시장에 적합한 가격을 얻는 것입니다.
테스트 및 QA. 개발자는 다양한 IP 주소와 국가에서의 요청에 대한 애플리케이션의 동작을 테스트하기 위해 프록시를 사용합니다. 이는 지리적 차단 또는 IP에 대한 비율 제한이 있는 서비스에 특히 중요합니다.
마케팅 자동화. 루비 스크립트는 종종 광고 캠페인을 모니터링하거나 검색 결과에서의 위치를 확인하거나 경쟁자의 활동을 추적하는 데 사용됩니다. 여기서 프록시는 부하 분산 및 제한 우회를 위해 필요합니다.
여러 계정 작업. 스크립트가 하나의 플랫폼에서 여러 계정을 관리하는 경우, 각 계정은 별도의 IP를 통해 작동해야 합니다 - 그렇지 않으면 플랫폼은 쉽게 연결을 감지하고 모든 것을 차단할 수 있습니다.
루비 작업에 적합한 프록시 유형 선택하기
모든 프록시가 다양한 작업에 동일하게 적합한 것은 아닙니다. 유형 선택은 스크립트의 성공적인 작동에 직접적인 영향을 미칩니다. 루비 개발에 적용 가능한 주요 옵션을 살펴보겠습니다.
| 프록시 유형 | 루비에서의 최적 작업 | 속도 | 보호 우회 |
|---|---|---|---|
| 데이터 센터 프록시 | 엄격한 보호가 없는 파싱, API 요청, 테스트 | 높음 | 중간 |
| 주거용 프록시 | 보호된 사이트 파싱, 소셜 미디어 작업, 마켓플레이스 | 중간 | 높음 |
| 모바일 프록시 | Facebook, Instagram, TikTok API, 계정 작업 | 중간 | 최대 |
데이터 센터 프록시는 가장 빠르고 저렴한 옵션입니다. 공격적인 보호가 없는 사이트 파싱, 대량 API 요청 및 부하 테스트에 적합합니다. 그러나 대형 플랫폼(Facebook, Google, Cloudflare)은 ASN 데이터 센터를 통해 쉽게 인식할 수 있습니다.
주거용 프록시는 실제 가정 사용자의 IP를 사용합니다. Wildberries, Ozon을 파싱하거나 보호된 사이트와 작업하는 루비 스크립트에 최적의 선택입니다. 사이트는 서버가 아닌 일반 사용자를 감지합니다.
모바일 프록시는 모바일 통신사의 IP(4G/5G)를 통해 작동합니다. 플랫폼 측면에서 가장 신뢰할 수 있는 주소입니다 - 하나의 모바일 IP는 수백 명의 실제 사용자가 동시에 사용할 수 있으므로 차단이 극히 드뭅니다. 루비 스크립트가 소셜 네트워크나 광고 플랫폼과 작업하는 경우 - 모바일 프록시는 차단 위험을 최소화합니다.
Net::HTTP에서 프록시: 기본 설정
Net::HTTP는 HTTP 요청을 위한 루비의 표준 라이브러리로, 언어의 표준 배포에 포함되어 있습니다. 이 라이브러리는 특별한 메서드 Net::HTTP::Proxy를 통해 프록시를 "상자에서" 지원합니다.
가장 간단한 방법은 프록시 클래스를 생성하고 이를 일반 Net::HTTP 대신 사용하는 것입니다:
require 'net/http'
require 'uri'
# 프록시 데이터
proxy_host = 'proxy.example.com'
proxy_port = 8080
# 프록시 클래스 생성
proxy_class = Net::HTTP::Proxy(proxy_host, proxy_port)
# 프록시를 통해 요청 수행
uri = URI('https://httpbin.org/ip')
proxy_class.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
request = Net::HTTP::Get.new(uri)
response = http.request(request)
puts response.body
end
Net::HTTP::Proxy 메서드는 네 개의 매개변수를 받습니다: 프록시 호스트, 포트, 사용자 이름 및 비밀번호. 처음 두 개는 필수이며, 마지막 두 개는 인증이 없는 프록시의 경우 선택 사항입니다.
대안적인 방법은 프록시 매개변수를 Net::HTTP.new 메서드에 직접 전달하는 것입니다:
require 'net/http'
uri = URI('https://httpbin.org/ip')
http = Net::HTTP.new(
uri.host,
uri.port,
'proxy.example.com', # proxy_addr
8080, # proxy_port
nil, # proxy_user (인증이 없는 경우 nil)
nil # proxy_pass
)
http.use_ssl = true
response = http.get(uri.path)
puts response.body
이 접근 방식은 동일한 HTTP 객체를 여러 요청에 재사용해야 할 때 유용합니다. 주의할 점: 프록시 매개변수는 세 번째 및 네 번째 인수로 전달되며, 별도의 메서드를 통해 전달되지 않습니다.
Net::HTTP를 통한 인증 및 HTTPS
대부분의 상업용 프록시는 인증 - 사용자 이름과 비밀번호를 요구합니다. 또한 HTTPS 사이트와 작업할 때는 SSL에 대한 추가 설정이 필요합니다. 두 가지 경우를 살펴보겠습니다.
로그인 및 비밀번호가 있는 프록시:
require 'net/http'
require 'uri'
proxy_host = 'proxy.example.com'
proxy_port = 8080
proxy_user = 'your_username'
proxy_pass = 'your_password'
# 인증이 있는 프록시 클래스를 생성합니다.
proxy_class = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass)
uri = URI('https://httpbin.org/ip')
proxy_class.start(uri.host, uri.port, use_ssl: true) do |http|
# SSL 인증을 비활성화합니다 (테스트용으로만!)
# http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri)
request['User-Agent'] = 'Mozilla/5.0 (compatible; MyBot/1.0)'
response = http.request(request)
puts "IP: #{response.body}"
puts "Status: #{response.code}"
end
중요한 점: HTTPS 프록시를 사용할 때 (CONNECT를 통한 터널링) Net::HTTP는 프록시 터널을 통해 대상 서버와 SSL 연결을 자동으로 설정합니다. 이는 대부분의 프록시 서버에서 올바르게 작동합니다.
환경 변수를 통한 설정. 프록시 데이터를 코드에 하드코딩하는 대신 환경 변수에서 읽는 것이 좋은 방법입니다:
require 'net/http'
require 'uri'
# 환경 변수에서 프록시 설정을 읽습니다.
proxy_uri = URI(ENV.fetch('HTTP_PROXY', 'http://proxy.example.com:8080'))
proxy_class = Net::HTTP::Proxy(
proxy_uri.host,
proxy_uri.port,
proxy_uri.user,
proxy_uri.password
)
target_uri = URI('https://httpbin.org/ip')
proxy_class.start(target_uri.host, target_uri.port, use_ssl: true) do |http|
response = http.get(target_uri.path)
puts response.body
end
환경 변수를 HTTP_PROXY=http://user:[email protected]:8080 형식으로 설정할 수 있습니다. 이 접근 방식은 코드를 변경하지 않고 프록시를 변경할 수 있게 해줍니다 - .env 파일이나 서버 설정에서 변수를 업데이트하기만 하면 됩니다.
Faraday를 통한 프록시 연결
Faraday는 루비 생태계에서 가장 인기 있는 HTTP 클라이언트 중 하나입니다. 편리한 미들웨어 접근 방식과 다양한 어댑터(Net::HTTP, HTTParty, Typhoeus 등)를 지원하기 때문에 많은 Rails 애플리케이션에서 사용됩니다. Faraday에서 프록시 설정은 사용되는 어댑터에 따라 약간 다릅니다.
Faraday에서의 기본 프록시 설정:
require 'faraday'
# 프록시와 함께 Faraday 연결 생성
conn = Faraday.new(url: 'https://httpbin.org') do |faraday|
faraday.proxy = {
uri: 'http://proxy.example.com:8080',
user: 'your_username',
password: 'your_password'
}
faraday.headers['User-Agent'] = 'Mozilla/5.0 (compatible; MyBot/1.0)'
faraday.adapter Faraday.default_adapter
end
response = conn.get('/ip')
puts response.body
puts "Status: #{response.status}"
faraday.proxy 매개변수는 uri, user 및 password 키가 있는 해시를 받습니다. 인증이 필요 없는 경우 URI 문자열을 직접 전달할 수도 있습니다.
Net::HTTP 어댑터와 함께하는 Faraday 및 고급 설정:
require 'faraday'
conn = Faraday.new(url: 'https://httpbin.org') do |faraday|
faraday.proxy = 'http://user:[email protected]:8080'
# 타임아웃 설정
faraday.options.timeout = 30
faraday.options.open_timeout = 10
# 로깅을 위한 미들웨어 (디버깅 시 유용)
faraday.response :logger
# 연결 오류 시 재시도
faraday.request :retry, max: 3, interval: 1
# 어댑터
faraday.adapter :net_http
end
begin
response = conn.get('/ip')
puts response.body
rescue Faraday::ConnectionFailed => e
puts "연결 오류: #{e.message}"
rescue Faraday::TimeoutError => e
puts "타임아웃: #{e.message}"
end
:retry 미들웨어는 프록시 작업 시 특히 유용합니다 - 하나의 주소가 일시적으로 사용할 수 없는 경우, Faraday는 요청을 자동으로 반복합니다. 이는 프로덕션에서 스크립트의 신뢰성 있는 작동을 위해 중요합니다.
Typhoeus 어댑터와 함께하는 Faraday (병렬 요청을 위한):
# Gemfile: gem 'typhoeus'
require 'faraday'
require 'typhoeus/adapters/faraday'
conn = Faraday.new(url: 'https://httpbin.org') do |faraday|
faraday.proxy = 'http://user:[email protected]:8080'
faraday.adapter :typhoeus
end
# 프록시를 통한 병렬 요청
responses = []
conn.in_parallel do
responses << conn.get('/ip')
responses << conn.get('/headers')
responses << conn.get('/user-agent')
end
responses.each { |r| puts r.body }
프록시 회전: 자동 IP 변경
하나의 프록시 주소, 심지어 주거용 프록시도, 집중적인 파싱 작업을 수행하면 언젠가는 제한에 걸리게 됩니다. 해결책은 회전입니다: 각 요청 후 또는 특정 간격마다 IP를 자동으로 변경하는 것입니다. 루비 스크립트를 위한 간단한 회전기를 구현해 보겠습니다.
프록시 배열 기반의 간단한 회전기:
require 'net/http'
require 'uri'
class ProxyRotator
def initialize(proxies)
@proxies = proxies
@index = 0
@mutex = Mutex.new
end
def next_proxy
@mutex.synchronize do
proxy = @proxies[@index % @proxies.length]
@index += 1
proxy
end
end
def random_proxy
@proxies.sample
end
end
# [host, port, user, pass] 형식의 프록시 목록
proxies = [
['proxy1.example.com', 8080, 'user1', 'pass1'],
['proxy2.example.com', 8080, 'user2', 'pass2'],
['proxy3.example.com', 8080, 'user3', 'pass3'],
]
rotator = ProxyRotator.new(proxies)
# 다양한 프록시를 통해 URL 목록 파싱
urls = [
'https://httpbin.org/ip',
'https://httpbin.org/headers',
'https://httpbin.org/user-agent'
]
urls.each do |url|
proxy = rotator.next_proxy
proxy_class = Net::HTTP::Proxy(proxy[0], proxy[1], proxy[2], proxy[3])
uri = URI(url)
begin
proxy_class.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.read_timeout = 15
response = http.get(uri.path)
puts "#{url} -> Status: #{response.code}, Proxy: #{proxy[0]}"
end
rescue => e
puts "프록시 #{proxy[0]}에서 오류 발생: #{e.message}"
# 자동으로 다음 프록시로 이동
end
sleep(rand(0.5..2.0)) # 요청 간의 무작위 지연
end
요청 간의 무작위 지연 (sleep(rand(0.5..2.0)))은 중요한 요소입니다. 고정 간격으로 요청하는 패턴은 안티봇 시스템에 쉽게 감지됩니다. 무작위 지연은 실제 사용자의 행동을 모방합니다.
미들웨어와 함께하는 Faraday를 통한 회전:
require 'faraday'
class ProxyMiddleware < Faraday::Middleware
PROXIES = [
'http://user1:[email protected]:8080',
'http://user2:[email protected]:8080',
'http://user3:[email protected]:8080',
].freeze
def call(env)
# 각 요청에 대해 무작위 프록시 선택
proxy_uri = URI(PROXIES.sample)
env[:request][:proxy] = {
uri: proxy_uri,
user: proxy_uri.user,
password: proxy_uri.password
}
@app.call(env)
end
end
# 미들웨어 등록
Faraday::Middleware.register_middleware proxy_rotator: ProxyMiddleware
conn = Faraday.new(url: 'https://httpbin.org') do |faraday|
faraday.use :proxy_rotator
faraday.adapter :net_http
end
5.times do
response = conn.get('/ip')
puts response.body
end
Rails 애플리케이션에 프록시 통합하기
Rails 애플리케이션에서 프록시는 주로 외부 HTTP 요청에 필요합니다: API 통합, 파싱의 백그라운드 작업 또는 웹훅. 몇 가지 실용적인 패턴을 살펴보겠습니다.
패턴 1: Faraday를 사용하는 서비스 객체. 모든 외부 HTTP 요청을 프록시를 통해 수행하는 기본 서비스 클래스를 생성합니다:
# app/services/http_client.rb
class HttpClient
def self.connection(base_url)
Faraday.new(url: base_url) do |faraday|
# Rails의 환경 변수에서 프록시
if Rails.env.production? && ENV['PROXY_URL'].present?
faraday.proxy = ENV['PROXY_URL']
end
faraday.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
faraday.options.timeout = 30
faraday.options.open_timeout = 10
faraday.request :retry, max: 3, interval: 2,
exceptions: [Faraday::ConnectionFailed, Faraday::TimeoutError]
faraday.response :raise_error
faraday.adapter :net_http
end
end
end
# 컨트롤러나 서비스에서 사용:
# client = HttpClient.connection('https://api.example.com')
# response = client.get('/products', { category: 'electronics' })
패턴 2: Rails credentials를 통한 설정. 프록시 데이터를 저장하기 위해 암호화된 Rails credentials를 사용합니다:
# config/credentials.yml.enc (rails credentials:edit를 통해 수정)
# proxy:
# host: proxy.example.com
# port: 8080
# username: your_user
# password: your_pass
# app/services/proxy_service.rb
class ProxyService
def self.faraday_proxy_config
creds = Rails.application.credentials.proxy
return nil unless creds
{
uri: "http://#{creds[:host]}:#{creds[:port]}",
user: creds[:username],
password: creds[:password]
}
end
def self.net_http_proxy
creds = Rails.application.credentials.proxy
return Net::HTTP::Proxy(nil, nil) unless creds
Net::HTTP::Proxy(
creds[:host],
creds[:port],
creds[:username],
creds[:password]
)
end
end
패턴 3: Sidekiq를 통한 백그라운드 작업. 파싱 또는 API 요청이 백그라운드 워커에서 수행되는 경우, 프록시 설정은 동일하지만 경쟁성을 고려하는 것이 중요합니다:
# app/workers/price_parser_worker.rb
class PriceParserWorker
include Sidekiq::Worker
sidekiq_options retry: 3, queue: :parsers
def perform(product_url)
# 각 워커에 대해 새로운 연결 생성
proxy = ProxyService.net_http_proxy
uri = URI(product_url)
proxy.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.read_timeout = 20
request = Net::HTTP::Get.new(uri)
request['User-Agent'] = random_user_agent
response = http.request(request)
if response.code == '200'
parse_and_save(response.body, product_url)
else
Rails.logger.warn "예상치 못한 상태 #{response.code} for #{product_url}"
end
end
rescue Net::OpenTimeout, Net::ReadTimeout => e
Rails.logger.error "타임아웃 for #{product_url}: #{e.message}"
raise # Sidekiq가 작업을 반복합니다.
end
private
def random_user_agent
agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]
agents.sample
end
def parse_and_save(html, url)
# 파싱 로직...
end
end
오류 처리 및 타임아웃
프록시를 통해 작업하면 추가적인 레이어가 생기고, 이는 특정 오류를 발생시킬 수 있습니다. 예외 처리를 잘하는 것은 5분 후에 중단되는 스크립트와 몇 시간 동안 개입 없이 작동하는 스크립트의 차이를 만듭니다.
루비에서 프록시 작업 시 주요 오류 유형:
| 예외 | 원인 | 대처 방법 |
|---|---|---|
Net::OpenTimeout |
프록시가 응답하지 않음 | 프록시 변경, 재시도 |
Net::ReadTimeout |
프록시가 느리거나 사이트가 응답하지 않음 | 타임아웃 증가 또는 프록시 변경 |
Errno::ECONNREFUSED |
프록시 서버가 연결을 거부함 | 프록시 데이터 확인 |
OpenSSL::SSL::SSLError |
프록시를 통한 SSL 문제 | SSL 설정 확인 |
| HTTP 407 | 잘못된 프록시 로그인/비밀번호 | 자격 증명 확인 |
| HTTP 403/429 | IP가 사이트에 의해 차단됨 | 프록시 변경, 지연 추가 |
자동 프록시 변경이 포함된 종합 오류 처리:
require 'net/http'
require 'uri'
class RobustHttpClient
MAX_RETRIES = 3
RETRIABLE_ERRORS = [
Net::OpenTimeout,
Net::ReadTimeout,
Errno::ECONNREFUSED,
Errno::ECONNRESET,
OpenSSL::SSL::SSLError
].freeze
def initialize(proxies)
@proxies = proxies.dup
@failed_proxies = []
end
def get(url, retries: MAX_RETRIES)
uri = URI(url)
attempt = 0
begin
attempt += 1
proxy = current_proxy
proxy_class = Net::HTTP::Proxy(*proxy)
proxy_class.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.open_timeout = 10
http.read_timeout = 20
request = Net::HTTP::Get.new(uri)
request['User-Agent'] = 'Mozilla/5.0 (compatible; RubyBot/1.0)'
response = http.request(request)
case response.code.to_i
when 200..299
response
when 407
raise "프록시 인증 실패: #{proxy[0]}"
when 403, 429
rotate_proxy!
raise "IP 차단됨 (#{response.code}), 프록시 회전 중"
else
raise "예상치 못한 HTTP 상태: #{response.code}"
end
end
rescue *RETRIABLE_ERRORS => e
Rails.logger.warn "연결 오류 (시도 #{attempt}/#{retries}): #{e.message}"
rotate_proxy!
retry if attempt < retries
raise "시도 #{retries}회 후 실패: #{e.message}"
rescue RuntimeError => e
Rails.logger.warn "HTTP 오류 (시도 #{attempt}/#{retries}): #{e.message}"
retry if attempt < retries
raise
end
end
private
def current_proxy
@proxies.first || raise("사용 가능한 프록시가 없습니다!")
end
def rotate_proxy!
failed = @proxies.shift
@failed_proxies << failed
Rails.logger.info "프록시 회전. 남은 프록시: #{@proxies.length}"
end
end
SOCKS5 프록시를 루비에서 설정하기: socksify를 통한 설정
표준 Net::HTTP는 SOCKS5를 기본적으로 지원하지 않습니다 - HTTP/HTTPS 프록시만 지원합니다. SOCKS5 작업을 위해서는 추가 라이브러리가 필요합니다. 가장 인기 있는 옵션은 socksify 젬입니다.
왜 SOCKS5가 HTTP 프록시보다 더 선호될 수 있을까요? SOCKS5 프로토콜은 더 낮은 수준에서 작동하며, HTTP만이 아닌 모든 TCP 트래픽을 프록시합니다. 또한, SOCKS5는 인증을 지원하고 요청에 대한 메타데이터를 덜 전달하여 봇 탐지 시스템에 덜 눈에 띄게 만듭니다.
# Gemfile
# gem 'socksify'
require 'socksify'
require 'socksify/http'
require 'net/http'
require 'uri'
# SOCKS5 프록시의 전역 설정
TCPSocket::socks_server = 'proxy.example.com'
TCPSocket::socks_port = 1080
# 선택 사항: 인증 (SOCKS5 사용자 이름/비밀번호)
# TCPSocket::socks_username = 'your_user'
# TCPSocket::socks_password = 'your_pass'
# 이제 모든 Net::HTTP 요청은 SOCKS5를 통해 전송됩니다.
uri = URI('https://httpbin.org/ip')
response = Net::HTTP.get_response(uri)
puts response.body
주의: socksify를 사용할 때 설정은 프로세스의 모든 TCP 연결에 전역적으로 적용됩니다. 더 유연한 설정이 필요한 경우, 동일한 젬의 Net::HTTP.SOCKSProxy를 사용하세요:
require 'socksify/http'
# SOCKS5 프록시 클래스를 생성합니다 (HTTP에 대한 Net::HTTP::Proxy와 유사).
socks_proxy = Net::HTTP.SOCKSProxy('proxy.example.com', 1080)
uri = URI('https://httpbin.org/ip')
socks_proxy.start(uri.host, uri.port, use_ssl: true) do |http|
response = http.get(uri.path)
puts response.body
end
SOCKS5를 사용하는 Faraday에는 이 프로토콜을 지원하는 어댑터가 필요합니다. 좋은 옵션은 faraday-net_http와 socksify의 조합이거나, libcurl을 통해 SOCKS5를 기본적으로 지원하는 curl 기반 어댑터 faraday-typhoeus를 사용하는 것입니다.
💡 프로토콜 선택에 대한 조언
대부분의 파싱 작업 및 API 작업에는 HTTP/HTTPS 프록시가 충분합니다 - 설정이 더 간단하고 기본적으로 지원됩니다. HTTP 프록시가 대상 서비스에 쉽게 감지되는 경우, HTTP 트래픽만이 아닌 모든 트래픽을 프록시해야 할 때 SOCKS5를 사용하는 것이 좋습니다. 모바일 및 주거용 프록시는 두 프로토콜 모두에서 사용할 수 있습니다.
결론 및 권장 사항
루비에서 프록시 설정은 복잡한 라이브러리를 필요로 하지 않습니다 - 표준 Net::HTTP는 HTTP 프록시를 "상자에서" 지원하며, Faraday는 미들웨어 아키텍처 덕분에 통합을 더욱 편리하게 만듭니다. 이 가이드의 주요 요점은 다음과 같습니다:
- Net::HTTP의 경우
Net::HTTP::Proxy를 사용하세요 - 이는 내장된 신뢰할 수 있는 방법입니다. - Faraday의 경우
faraday.proxy매개변수는 URI 문자열이나 자격 증명을 가진 해시를 받을 수 있습니다. - 프록시 데이터를 환경 변수 또는 Rails credentials에 저장하세요 - 코드에 하드코딩하지 마세요.
- 프로덕션에서 신뢰할 수 있는 작동을 위해 프록시 회전 및 오류 처리를 구현하세요.
- 무작위 지연 및 User-Agent 회전을 추가하여 인간 행동을 모방하세요.
- SOCKS5의 경우
socksify젬을 사용하세요.
프록시 유형 선택은 작업에 따라 달라집니다. Wildberries 또는 Ozon을 위한 파서를 작성하는 경우 - 주거용 프록시가 속도와 보호 우회 간의 최적의 균형을 제공합니다: 실제 가정 사용자의 IP는 차단 목록에 올라가는 경우가 극히 드뭅니다. 대량의 요청을 처리하는 고부하 작업에는 데이터 센터 프록시가 적합합니다 - 요청당 더 빠르고 저렴합니다. 루비 스크립트가 소셜 네트워크나 광고 API와 작업하는 경우 - 모바일 프록시를 고려하세요: 그들의 IP 주소는 대부분의 플랫폼에서 최대 신뢰 수준을 가지고 있습니다.
```