5Март
Mechanize через SOCKS5 или парсим Tor
Posted by lukmus | Category: ruby & ruby on rails | No Comments
Незаменимый для парсинга гем Mechanize, эмулирующий браузер, по умолчанию поддерживает только обычные прокси. Широкой общественности известен факт, что для подключения к Tor-сайтам используется SOCKS5, который организуется через Privoxy. Этот пост повествует как заставить Mechanize подключиться к Tor-сайтам.
Обычный запрос Mechanize’а через прокси имеет вид что-то типа:
1 2 3 | browser = Mechanize.new browser.agent.set_proxy(host,port) page=browser.get 'http://lukmus.ru' |
Жизнь была бы проще если бы мы могли заменить метод set_proxy
класса Mechanize::HTTP::Agent
на аналогичный set_socks
, но такого метода в этом классе нет. Однако его можно дописать самому, например вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | require "socksify" require 'socksify/http' class Faraday::Adapter::NetHttp def net_http_class(env) if proxy = env[:request][:proxy] if proxy[:uri].scheme == 'socks' Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port) else Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password]) end else Net::HTTP end end end class Mechanize::HTTP::Agent public def set_socks addr, port set_http unless @http class << @http attr_accessor :socks_addr, :socks_port def http_class Net::HTTP.SOCKSProxy(socks_addr, socks_port) end end @http.socks_addr = addr @http.socks_port = port end end |
Как подключать файлы, с содержанием подобному выше, к Rails-приложению каждый знает и без меня.