rubyのtor-privoxyを使って、IPを偽装しつつHTMLを取得する

WEBスクレイピングをするとき、いい感じの串を用意するのが面倒な時がある

そんな時、このtor-privoxyを使うと、
tor経由でipを偽装しHTMLを取得することができる
さらに、アクセスしたipで40X系のエラーが出た場合は、新しいIPでリトライしてくれる。
色々と捗ることまちがいなし!

下準備:torとprivoxyをインストールする

とりあえずrubyがインストールされたLinux mint環境で作業
※virtual box環境だとprivoxyがうまく動かないので、必ず生の環境で

※windows環境では試してないが、privoxyとtorさえ正しく動けば問題ないはず

/etc/privoxy/configの1314行目をコメントアウト

privoxyを再起動する

firefoxで動作確認

現在のIPを確認
http://ifconfig.me/ip

firefoxを開き[編集]→[設定]→[詳細]→[ネットワーク]→[接続設定]
「手動でプロキシを設定する」を選択
「HTTPプロキシ」に127.0.0.1、ポートに8118(privoxyが動作しているポート)を記入する

変更後のIPを確認
http://ifconfig.me/ip

ここで正しくIPが変わっていれば準備完了!
(おかしな表示になったら/etc/privoxy/confの設定が間違ってないか確認)

rubyでtor-privoxyを通す

tor-privoxyをインストール

スクリプトを書く

実行する

ここで

`fetch’: 503 => Net::HTTPServiceUnavailable for http://ifconfig.me/ip — unhandled response (Mechanize::ResponseCodeError)

と出た場合は、もう一度firefoxでprivoxyの動作を確認する
privoxyをリスタートすることで治ることがある

ターゲットのhtmlを取得する

テストターゲットはこちら
http://ja.wikipedia.org/wiki/Privoxy

出力結果

tor.get(url)の部分は、Mechanizeを使っている。
従って、get(url)で帰ってきたものはtor.get(url).search(‘table tr’)というふうにNokogiriを使ってパースする
日本語のページは適宜
tor.get(url).search(‘table td’).search(‘a’).children.to_s.encode(‘utf-8’)
というようにエンコードしてやる

解説

全体の流れ
tor-provixy(mechanize) → provixy → tor

tor-provixyはMechanizeを使ってHTTPにリクエストしている。

こうすることで、内部のmechanizeに127.0.0:8118で稼働しているprivoxyをプロキシとして使うように設定される。

privoxyは、webリクエストをフィルタリングする機能がある
torはport 9050でsocksサーバーとして稼働しているので
privoxy側でtorが稼働している9050に受け流すことで、
最終的にtorネットワークを使ったipの隠蔽が可能になっている

注意点

このまま使っても良いが、万全を期すなら、OS側のDNSを切ったほうが良い。
また、torとprivoxyに使うportは変更すべきである
さらに、torにはpasswordを設定すべき

h-iwata

最近までReactでフロントエンド構築してました フリーランスなんでサーバーサイド、アプリ、ゲームなどなんでもやります。現在はunityでVRゲーム作ってます。 何か聞きたいことや頼みたいことがあるならコメント欄か、直接facebookまでどうぞ。

コメントを残す

メールアドレスが公開されることはありません。