pythonリクエストをsocksプロキシ経由で機能させる方法


83

PythonスクリプトですばらしいRequestsライブラリを使用しています。

import requests
r = requests.get("some-site.com")
print r.text

ソックスプロキシを使用したいのですが。ただし、Requestsは現在HTTPプロキシのみをサポートしています。

どうやってやるの?

回答:


116

現代的な方法:

pip install -U requests[socks]

その後

import requests

resp = requests.get('http://go.to', 
                    proxies=dict(http='socks5://user:pass@host:port',
                                 https='socks5://user:pass@host:port'))

3
SOCKSを使用する際に注意してください、プロキシrequesocksはHTTPを行います完全なURLとリクエスト(例えば、「GET example.com HTTP / 1.1」ではなく「GET / HTTP / 1.1」より)と、この動作は、問題が発生することがあります。残念ながら、今のところこれ以上の解決策はないようです。
a3nm 2014年

さらに、プロキシ設定でユーザー名とパスワードを使用する方法が見つかりませんでした。urllib2に頼らなければなりませんでした。
のEncompass

9
私はzshを使用していますが、bash -c "pip install -U requests[socks]"代わりに使用する必要がありzsh: no matches found: requests[socks]ます。そうしないと、zshが文句を言います。
ブルースサン

3
Windowsでは、次のものも必要です。pipinstall win-inet-pton
rstaveley

4
@BruceSunはpip install 'requests[socks]'十分であろう
bakatrouble

55

2016-04-29にリリースされたrequestsバージョン2.10.0の時点で、requestsSOCKSをサポートしています。

一緒にインストールできるPySocksが必要ですpip install pysocks

使用例:

import requests
proxies = {'http': "socks5://myproxy:9191"}
requests.get('http://example.org', proxies=proxies)

3
pip install -U requests[socks] is
enogh

8
私の場合、pip install -Urequests [socks]だけでは機能しません。pip installpysocksは必須です。
デンマーク2016年

これを修正するのと同じようにrequests、のバージョンをSOCKS(> 2.10.0)をサポートするバージョンに手動でアップグレードするには、pip :(pip install requests==2.18.4これを書いている時点では2.18.4)を実行しますが、チェック:pypi。最新バージョンのpython.org/pypi/requests(このページでは、最新の安定版が何であるかを上部ヘッダーに表示する必要があります)。
ntk4 2017

これは@DenMarkと一緒です。私の仕事用ラップトップはMacであり、何を試しても、リクエスト[靴下]はインストールを拒否しました...靴下はすべてを魔法のように修正しました。
ジェレミーローガン

私の場合、socksモジュール名がと競合しているqBittorrentので、エラーメッセージを解決するために、それぞれ削除/移動~/.local/share/data/qBittorrent/nova3/socks.pyして削除する必要があります。socks.pycmodule 'socks' has no attribute 'create_connection'bad magic number in 'socks':
フルーツ

43

誰かがこれらの古い答えをすべて試しても、まだ次のような問題が発生している場合。

requests.exceptions.ConnectionError: 
   SOCKSHTTPConnectionPool(host='myhost', port=80): 
   Max retries exceeded with url: /my/path 
   (Caused by NewConnectionError('<requests.packages.urllib3.contrib.socks.SOCKSConnection object at 0x106812bd0>: 
   Failed to establish a new connection: 
   [Errno 8] nodename nor servname provided, or not known',))

これは、デフォルトで、接続のローカル側でrequestsDNSクエリを解決するように構成されていることが原因である可能性があります。

プロキシURLをからsocks5://proxyhost:1234に変更してみてくださいsocks5h://proxyhost:1234。余分なものに注意してくださいh(ホスト名解決を表します)。

PySocksパッケージモジュールのデフォルトはリモート解決を行うことであり、リクエストが統合をこれほどあいまいに発散理由はわかりませんが、ここにあります。


6
それはまさに私の問題でした!ありがとう!
xbeta 2017年

4
これは私にとって正確な問題でした。プロキシを介してDNSクエリを実行していませんでした。hを追加するとすぐに、すべてが正しく機能しました。
jamescampbell

1
おかげで、このsocks5hアプローチは以前にやらなければならないと心配していたモンキーパッチの回避策よりもはるかにクリーンです。
ダリエン2018

1
非常に素晴らしい。socks5h://プロキシに関するPythonドキュメントの場所が見つかりませんでした。間違った場所を探していたに違いありません。お奨めはSOが大好きです。
ligemer 2018

1
@Ligemerは、コードだけを見るのが適切な場合があります。(しかし、コードを見て、StackOverflowを更新すると、2つの正しい場所があります:))
Mahmoud Hashemi 2018

18

pysocksをインストールする必要があります。私のバージョンは1.0で、コードは機能します。

import socket
import socks
import requests
ip='localhost' # change your proxy's ip
port = 0000 # change your proxy's port
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, ip, port)
socket.socket = socks.socksocket
url = u'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=inurl%E8%A2%8B'
print(requests.get(url).text)

すごい!socks 5プロキシを介してパッケージ(flickrapiなど)を使用する場合に便利です
MZD

2
socksプロキシを使用するのは良い方法ではありません。デフォルトのソケットを変更して間違いを犯すため、テストするだけで問題ありませんが、実際には問題ありません。
lqhcpsgbl 2016年

6

PythonrequestsSOCKS5プルリクエストとマージされるとすぐに、proxies辞書を使用するのと同じくらい簡単になります。

#proxy
        # SOCKS5 proxy for HTTP/HTTPS
        proxies = {
            'http' : "socks5://myproxy:9191",
            'https' : "socks5://myproxy:9191"
        }

        #headers
        headers = {

        }

        url='http://icanhazip.com/'
        res = requests.get(url, headers=headers, proxies=proxies)

SOCKSプロキシサポートを参照してください

組み込みモジュールrequestがないためrequesocksにGoogleAppEngineのように、使用できないときに準備が整うのを待つことができない場合の別のオプションは、上記のPySockspwdを使用することです

  1. グラブのsocks.pyレポからファイルをして、ルートフォルダにコピーを置きます。
  2. 追加import socksしてimport socket

この時点urllib2で、次の例で-を使用する前に、ソケットを構成してバインドします。

import urllib2
import socket
import socks

socks.set_default_proxy(socks.SOCKS5, "myprivateproxy.net",port=9050)
socket.socket = socks.socksocket
res=urllib2.urlopen(url).read()

2
# SOCKS5 proxy for HTTP/HTTPS
proxiesDict = {
    'http' : "socks5://1.2.3.4:1080",
    'https' : "socks5://1.2.3.4:1080"
}

# SOCKS4 proxy for HTTP/HTTPS
proxiesDict = {
    'http' : "socks4://1.2.3.4:1080",
    'https' : "socks4://1.2.3.4:1080"
}

# HTTP proxy for HTTP/HTTPS
proxiesDict = {
    'http' : "1.2.3.4:1080",
    'https' : "1.2.3.4:1080"
}

4
これは最新のRequestsバージョンでどのように機能しますか?なしrequesocks
gtx 2015

これはproxies最新のrequestsプルリクエストの辞書であり、現時点ではまだマージされていません。@ see-github.com
kennethreitz

2

次のように、pysocksとモンキーパッチを適用したcreate_connectionをurllib3にインストールしました。

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "127.0.0.1", 1080)

def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                      source_address=None, socket_options=None):
    """Connect to *address* and return the socket object.

    Convenience function.  Connect to *address* (a 2-tuple ``(host,
    port)``) and return the socket object.  Passing the optional
    *timeout* parameter will set the timeout on the socket instance
    before attempting to connect.  If no *timeout* is supplied, the
    global default timeout setting returned by :func:`getdefaulttimeout`
    is used.  If *source_address* is set it must be a tuple of (host, port)
    for the socket to bind as a source address before making the connection.
    An host of '' or port 0 tells the OS to use the default.
    """

    host, port = address
    if host.startswith('['):
        host = host.strip('[]')
    err = None
    for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
        af, socktype, proto, canonname, sa = res
        sock = None
        try:
            sock = socks.socksocket(af, socktype, proto)

            # If provided, set socket level options before connecting.
            # This is the only addition urllib3 makes to this function.
            urllib3.util.connection._set_socket_options(sock, socket_options)

            if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
                sock.settimeout(timeout)
            if source_address:
                sock.bind(source_address)
            sock.connect(sa)
            return sock

        except socket.error as e:
            err = e
            if sock is not None:
                sock.close()
                sock = None

    if err is not None:
        raise err

    raise socket.error("getaddrinfo returns an empty list")

# monkeypatch
urllib3.util.connection.create_connection = create_connection

0

多分これは助けることができます:

https://github.com/kennethreitz/requests/pull/478


2
ディスカッションスレッドは、SOCKSサポートをurllib3に統合してからリクエストすることを示しているようです。現在のところ、github.com / shazow / urllib3 / pull / 68はまだ開いています。
David Xia

github.com/shazow/urllib3/pull/68の問題は解決されました(ただし、実際に機能するかどうかは確認していません)。
Jan Vlcinsky 2014年

0

Linuxでこれを行うことができます。

$ pip3 install --user 'requests[socks]'
$ https_proxy=socks5://<hostname or ip>:<port> python3 -c \
> 'import requests;print(requests.get("https://httpbin.org/ip").text)'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.