type requests library example content python proxy socks python-requests

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)



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)

Ver SOCKS Proxy Support

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:

  1. socks.py archivo socks.py del repositorio y coloca una copia en tu carpeta raíz;
  2. Añadir import socks import socket y import 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" }