Comment faire fonctionner les requêtes python via Socks proxy

j'utilise le grand demandes bibliothèque dans mon script Python:

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

j'aimerais utiliser socks proxy. Mais Requests ne supporte que le mandataire HTTP maintenant.

Comment puis-je le faire?

43
demandé sur izhak 2012-09-26 16:02:26

8 réponses

La manière moderne:

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'))
67
répondu dvska 2016-06-15 04:51:19

requests version 2.10.0, publié sur 2016-04-29, requests prise en charge des CHAUSSETTES.

il faut PySocks, qui peut être installé avec pip install pysocks.

Exemple d'utilisation:

import requests
proxies = {'http': "socks5://myproxy:9191"}
requests.get('http://example.org', proxies=proxies)
24
répondu Jim 2016-04-30 13:11:33

Dans le cas où quelqu'un a essayé toutes ces réponses, et est toujours en cours d'exécution dans les problèmes de la forme:

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',))

Il est peut-être parce que, par défaut, requests est configuré pour résoudre les requêtes DNS sur côté de la connexion.

essayez de changer l'URL de votre mandataire de socks5://proxyhost:1234socks5h://proxyhost:1234. Note supplémentaires h (c'est l'abréviation de hostname resolution).

le module de paquet PySocks par défaut est de faire la résolution à distance, et Je ne sais pas pourquoi les demandes sont faites!--16-->leur intégration c'est obscurément divergent, mais nous y voilà.

19
répondu Mahmoud Hashemi 2018-08-05 00:56:55

vous devez installer pysocks , ma version 1.0 et le code fonctionne pour moi:

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)
11
répondu lqhcpsgbl 2015-10-21 07:53:16

dès Que python requests sera fusionné avec SOCKS5 pull request, il va faire aussi simple que d'utiliser proxies dictionnaire:

#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)

Voir SOCKS Proxy Support

une autre option, au cas où vous ne pouvez pas attendre request pour être prêt, quand vous ne pouvez pas utiliser requesocks - comme sur GoogleAppEngine en raison de l'absence de pwd module intégré, est d'utiliser PySocks qui a été mentionné ci-dessus:

  1. Saisir socks.py fichier à partir de la mise en pension et de mettre une copie dans votre dossier racine;
  2. Ajouter import socks et import socket

a ce point configurer et lier la socket avant de l'utiliser avec urllib2 - dans l'exemple suivant:

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
répondu loretoparisi 2016-04-05 22:56:21

j'ai installé pysocks et monkey patched create_connection dans urllib3, comme ceci:

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
1
répondu Edward Betts 2016-02-20 17:26:38

Peut-être cela peut vous aider:

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

0
répondu wroniasty 2012-09-26 13:00:30
# 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"
}
0
répondu wcc526 2015-08-28 09:35:52