15

オープナーベーシックごとに1つのソックスサーバーでSOCKSプロキシを介してurllib2でページをフェッチすることは可能ですか? setdefaultproxy メソッドを使用したソリューションを見てきましたが、異なるオープナーに異なるソックスが必要です。

SocksiPy ライブラリがありますが、これはうまく機能しますが、次のように使用する必要があります。

import socks
import socket
socket.socket = socks.socksocket
import urllib2
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "x.x.x.x", y)

つまり、すべての urllib2 リクエストに対して同じプロキシを設定します。オープナーごとに異なるプロキシを使用するにはどうすればよいですか?

4

7 に答える 7

17

pycurlで試してください:

import pycurl
c1 = pycurl.Curl()
c1.setopt(pycurl.URL, 'http://www.google.com')
c1.setopt(pycurl.PROXY, 'localhost')
c1.setopt(pycurl.PROXYPORT, 8080)
c1.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)

c2 = pycurl.Curl()
c2.setopt(pycurl.URL, 'http://www.yahoo.com')
c2.setopt(pycurl.PROXY, 'localhost')
c2.setopt(pycurl.PROXYPORT, 8081)
c2.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)

c1.perform() 
c2.perform() 
于 2010-04-03T05:54:34.780 に答える
11

はい、できます。How can I use a SOCKS 4/5 proxy with urllib2? で回答を繰り返します。 http プロキシの場合と同様に、すべてのプロキシに対してオープナーを作成する必要があります。この機能を SocksiPy に追加するためのコードは、GitHub https://gist.github.com/869791で入手でき、次のように簡単です。

opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS4, 'localhost', 9999))
print opener.open('http://www.whatismyip.com/automation/n09230945.asp').read()

詳細については、回転プロキシのように動作する複数の Tor インスタンスを実行する例を書きました:複数の Tor 回路による分散スクレイピング

于 2011-12-12T17:43:59.197 に答える
0

すべてのオープナーに対してソケットが 1 つしかなく、ソックスの実装はソケット レベルで行われます。だから、できません。
pycurl ライブラリを使用することをお勧めします。より柔軟です。

于 2010-04-01T16:31:08.350 に答える
0

==編集==(古いHTTPプロキシの例はこちら..)

私のせい.. urllib2 には、SOCKS プロキシの組み込みサポートがありません..

SOCKS を urllib2 (または一般的なソケット オブジェクト) に追加するいくつかの「ハック」がここにあります
しかし、これが必要な複数のプロキシで機能するとは思えません。

urllib2.ProxyHandler をフック/サブクラス化したくない限り、pycurl を使用することをお勧めします。

于 2010-03-29T14:16:24.543 に答える
0

一度に行われる接続が多すぎず、複数のスレッドからアクセスする必要がある場合は、スレッド ロックを使用できる可能性があります。

import socks
import socket
import thread
lock = thread.allocate_lock()
socket.socket = socks.socksocket

def GetConn():
    lock.acquire()
    import urllib2
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "x.x.x.x", y)
    conn = urllib2.urlopen(ARGUMENTS HERE)
    lock.release()
    return conn

接続を取得する必要があるたびに、次のようなものを使用できる場合もあります。

urllib2 = execfile('urllib2.py')
urllib2.socket = dummy_class() # dummy_class needs the socket module's methods

これらは明らかに素晴らしい解決策ではありませんが、とにかく2¢を入れました:-)

于 2010-04-06T15:52:45.057 に答える
0

SOCKS プロキシを使用するための面倒ですが実用的な解決策は、プロキシ チェーンを使用して provixy をセットアップし、システム変数またはその他の方法を介して privoxy によって提供される HTTP_PROXY を設定することです。

于 2011-01-10T14:03:59.750 に答える
-3

次の形式で環境変数HTTP_PROXYを設定することで、これを行うことができます。

user:pass @ proxy:port

または、bat / cmdを使用する場合は、スクリプトを呼び出す前に追加します。

HTTP_PROXY = user:pass @ proxy:portを設定します

私はそのようなcmd-fileを使用して、プロキシの下でeasy_installを機能させています。

于 2010-05-20T15:10:21.307 に答える