17

サンプルコード:

#!/usr/bin/python
import socks
import socket
import urllib2

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "127.0.0.1", 9050, True)
socket.socket = socks.socksocket

print urllib2.urlopen("http://almien.co.uk/m/tools/net/ip/").read()

TOR は、ポート 9050 (デフォルト) で SOCKS プロキシを実行しています。リクエストは TOR を通過し、自分以外の IP アドレスで表示されます。ただし、TOR コンソールには次の警告が表示されます。

"Feb 28 22:44:26.233 [警告] あなたのアプリケーション (ポート 80 に socks4 を使用) は、Tor に IP アドレスのみを与えています。DNS 解決を行うアプリケーションは、情報を漏洩する可能性があります。代わりに Socks4A (privoxy または socat 経由など) を使用することを検討してください。詳細については、 https://wiki.torproject.org/TheOnionRouter/TorFAQ#SOCKSAndDNSを参照してください。"

つまり、DNS ルックアップはプロキシを経由しません。しかし、それが setdefaultproxy の 4 番目のパラメーターが行うべきことですよね?

http://socksipy.sourceforge.net/readme.txtから:

setproxy(proxytype, addr[, port[, rdns[, username[, password]]]])

rdns - これはブール値のフラグで、DNS 解決に関する動作を変更します。True に設定されている場合、DNS 解決はサーバー上でリモートで実行されます。

PROXY_TYPE_SOCKS4 と PROXY_TYPE_SOCKS5 の両方を選択しても同じ効果があります。

このコンピューターが以前にアクセスしたことのないドメインに URL を変更すると発生するため、ローカル DNS キャッシュにすることはできません (urllib2 がそれをサポートしている場合)。

4

3 に答える 3

21

問題は、ソケットを接続する前に通常の方法で DNS 要求を行うモジュールのヘルパー関数をhttplib.HTTPConnection使用することです。socketcreate_connectiongetaddrinfo

解決策は、クラスで行うのと同じように、独自の関数を作成し、インポートする前create_connectionにモジュールにモンキー パッチを適用することです。socketurllib2socket

import socks
import socket
def create_connection(address, timeout=None, source_address=None):
    sock = socks.socksocket()
    sock.connect(address)
    return sock

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)

# patch the socket module
socket.socket = socks.socksocket
socket.create_connection = create_connection

import urllib2

# Now you can go ahead and scrape those shady darknet .onion sites
于 2012-12-17T03:32:33.080 に答える
5

urllib2問題は、ソックス接続をセットアップする前にインポートしていることです。

代わりにこれを試してください:

import socks
import socket

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, '127.0.0.1', 9050, True)
socket.socket = socks.socksocket

import urllib2
print urllib2.urlopen("http://almien.co.uk/m/tools/net/ip/").read()

手動リクエストの例:

輸入靴下                                                         
URLパースをインポート                                                      

SOCKS_HOST = 'ローカルホスト'                                             
SOCKS_PORT = 9050                                                    
SOCKS_TYPE = 靴下.PROXY_TYPE_SOCKS5                                 

URL = 'http://www.whatismyip.com/automation/n09230945.asp'           
解析済み = urlparse.urlparse(url)                                      


ソケット = ソックス.socksocket()                                          
socket.setproxy(SOCKS_TYPE, SOCKS_HOST, SOCKS_PORT)                  
socket.connect((parsed.netloc, 80))                                  
socket.send('''GET %(uri)s HTTP/1.1                                  
ホスト: %(host)s                                                       
接続: 閉じる                                                    

'''%辞書(                                                          
    uri=parsed.path,                                                 
    ホスト = parsed.netloc、                                              
)))                                                                   

印刷 socket.recv(1024)                                              
ソケット.close()
于 2011-02-28T23:05:40.923 に答える
3

http://blog.databigbang.com/distributed-scraping-with-multiple-tor-circuits/で、urllib2 + SOCKS + Tor の使用方法を示す完全なソース コードを含む記事を公開しました。

問題が解決することを願っています。

于 2011-12-16T18:13:32.647 に答える