Mechanize через SOCKS5 или парсим Tor

Незаменимый для парсинга гем 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-приложению каждый знает и без меня.

No Comments.

Leave a Reply

(обязательно)

(обязательно)