8

我正在编写一个自动爬取网站以进行数据分析的 Ruby 脚本,现在我有一个相当复杂的要求:我必须能够模拟来自不同国家的访问,大约 20 个不同的国家。该网站将根据 IP 位置包含不同的信息,因此完成它的唯一方法是从实际位于该国家/地区的服务器请求它。

由于我不想在这 20 个国家/地区中的每一个都购买服务器,因此我选择尝试 Tor - 你们中的许多人都知道,通过编辑 torrc 配置文件,可以指定退出节点,从而指定国家/地区实际请求将来自哪个。

当我手动执行此操作时,例如通过编辑 torrc 文件以使用阿根廷服务器,然后使用 Vidalia 断开 Tor,重新连接 Vidalia,然后重新运行请求,它工作正常。但是,我想完全自动化这个过程,并尽可能高效地完成它。Tor 是用 C 语言编写的,我想避免为此拆开它的整个源代码。知道仅使用 Ruby 来自动化整个过程的最简单方法是什么吗?

另外,如果我遗漏了一些东西,并且有一个更简单的替代方案可以替代整个考验,请告诉我。

谢谢!

4

1 回答 1

12

请看一下 Tor 控制协议。您可以使用 telnet 控制电路。 http://thesprawl.org/memdump/?entry=8

要切换到一个新的电路,它会切换到一个新的端点:

  require 'net/telnet'

  def switch_endpoint
    localhost = Net::Telnet::new("Host" => "localhost", "Port" => "9051", "Timeout" => 10, "Prompt" => /250 OK\n/)
    localhost.cmd('AUTHENTICATE ""') { |c| print c; throw "Cannot authenticate to Tor" if c != "250 OK\n" }
    localhost.cmd('signal NEWNYM') { |c| print c; throw "Cannot switch Tor to new route" if c != "250 OK\n" }
    localhost.close
  end

请注意创建新电路的延迟,可能需要几秒钟,因此您最好在代码中添加延迟,或通过调用某个远程 IP 检测站点检查您的地址是否已更改。

于 2011-07-30T11:10:22.027 回答