requests - response 200 python
Cómo hacer que las solicitudes de Python funcionen a través de socks proxy (8)
A partir de las requests
versión 2.10.0 , publicada el 2016-04-29, las requests
compatibles con SOCKS.
Requiere PySocks , que se puede instalar con pip install pysocks
.
Ejemplo de uso:
import requests
proxies = {''http'': "socks5://myproxy:9191"}
requests.get(''http://example.org'', proxies=proxies)
Estoy usando la gran biblioteca de Requests en mi script de Python:
import requests
r = requests.get("some-site.com")
print r.text
Me gustaría usar calcetines proxy. Pero las solicitudes solo son compatibles con el proxy HTTP ahora.
¿Cómo puedo hacer eso?
En caso de que alguien haya intentado todas estas respuestas anteriores y aún se encuentre con problemas como:
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'',))
Puede ser porque, de forma predeterminada, las requests
están configuradas para resolver consultas de DNS en el lado local de la conexión.
Intente cambiar la URL de su proxy desde socks5://proxyhost:1234
a socks5h://proxyhost:1234
. Tenga en cuenta la h
adicional (que representa la resolución del nombre de host).
El módulo por defecto del módulo PySocks es hacer una resolución remota , y no estoy seguro de por qué las solicitudes hicieron que su integración fuera tan divergente, pero aquí estamos.
Instalé pysocks y monkey parcheado create_connection en urllib3, como este:
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
La forma moderna:
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''))
Necesitas instalar pysocks , mi versión es 1.0 y el código funciona para mí:
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)
Tal vez esto pueda ayudar:
Tan pronto como las requests
Python se fusionen con la SOCKS5
extracción SOCKS5
, se hará tan simple como usar el diccionario de 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)
Otra opción, en caso de que no pueda esperar la request
para estar listo, cuando no pueda usar requesocks
, como en GoogleAppEngine debido a la falta de un módulo incorporado de pwd
, es usar PySocks que se mencionó anteriormente:
-
socks.py
archivosocks.py
del repositorio y coloca una copia en tu carpeta raíz; - Añadir
import socks
import socket
yimport socket
En este punto, configure y enlace el zócalo antes de usarlo con urllib2
, en el siguiente ejemplo:
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"
}