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?
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'))
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à.
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)
Dès que python requests
sera fusionné avec SOCKS5
tire 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:
socks.py
fichier du référentiel et placez une copie dans votre dossier racine;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()
# 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"
}
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
Peut-être que cela peut aider: