99 votes

Comment faire fonctionner les requêtes python via un proxy socks ?

J'utilise le grand Demandes dans mon script Python :

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

Je voudrais utiliser le proxy socks. Mais Requests ne prend en charge que le proxy HTTP pour le moment.

Comment puis-je faire ça ?

151voto

dvska Points 145

La méthode moderne :

pip install -U requests[socks]

entonces

import requests

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

64voto

Jim Points 585

A partir de requests version 2.10.0 publié le 29 avril 2016, requests supporte SOCKS.

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)

60voto

Marie Talcod Points 1

Au cas où quelqu'un aurait essayé toutes ces anciennes réponses, et rencontrerait encore des problèmes comme.. :

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

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

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

Le module PySocks permet par défaut la résolution à distance. et je ne suis pas sûr de savoir pourquoi les demandes ont fait leur intégration cette obscure divergence, mais nous y sommes.

19voto

lqhcpsgbl Points 2431

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)

6voto

loretoparisi Points 1206

Dès que python requests sera fusionné avec SOCKS5 la demande de pull, il suffira 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)

Véase Support du proxy SOCKS

Autres options, au cas où vous ne pourriez pas attendre request pour être prêt, alors que 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. Saisissez le socks.py depuis le dépôt et mettez une copie dans votre dossier racine ;
  2. Ajouter import socks y import socket

A ce stade, 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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X