web-dev-qa-db-fra.com

Comment faire python Les requêtes fonctionnent via un proxy socks

J'utilise la grande bibliothèque Requests dans mon Python script:

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

Je voudrais utiliser le proxy chaussettes. Mais les demandes ne supporte que le proxy HTTP maintenant.

Comment puis je faire ça?

59
izhak

La manière moderne:

pip install -U requests[socks]

puis

import requests

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

À partir de requests version 2.10. , publiée le 2016-04-29, requests prend en charge SOCKS.

Il nécessite 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)
40
Jim

Au cas où quelqu'un aurait essayé toutes ces réponses précédentes et aurait encore des problèmes tels que:

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

Cela peut être dû au fait que, par défaut, requests est configuré pour résoudre les requêtes DNS du côté local de la connexion.

Essayez de changer votre URL de proxy de socks5://proxyhost:1234 à socks5h://proxyhost:1234. Notez l'extra h (il s'agit de la résolution du nom d'hôte).

Le module du paquet PySocks est par défaut de faire la résolution à distance , et je ne suis pas sûr de savoir pourquoi les requêtes sont faites leur intégration ceci divergent obscurément, mais nous en sommes là.

28
Mahmoud Hashemi

Vous devez installer pysocks , ma version est 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)
15
lqhcpsgbl

Dès que python requests sera fusionné avec SOCKS5tire la requête, cela se fera aussi simplement qu'en utilisant le dictionnaire 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)

Voir Support proxy SOCKS

Une autre option, au cas où vous ne pouvez pas attendre que request soit prêt, lorsque vous ne pouvez pas utiliser requesocks - comme sur GoogleAppEngine en raison du manque de module intégré pwd, est utiliser PySocks mentionné ci-dessus:

  1. Prenez le socks.py fichier du référentiel et placez une copie dans votre dossier racine;
  2. Ajouter import socks et import socket

À ce stade, configurez et liez le 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()
5
loretoparisi
# 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"
}
2
wcc526

J'ai installé pysocks et monkey patché dans 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
Edward Betts
0
wroniasty