2011-11-27 24 views
83

Solo uno corto y simple sobre el excelente módulo Requests para Python.Proxies con el módulo 'Solicitudes' de Python

Parece que no puedo encontrar en la documentación lo que debe contener la variable 'proxies'. Cuando le envío un dict con un valor "IP: PORT" estándar, lo rechazó pidiendo 2 valores. Entonces, supongo (porque esto no parece estar cubierto en los documentos) que el primer valor es el ip y el segundo el puerto?

Los documentos mencionan esto sólo:

proxies – (optional) Dictionary mapping protocol to the URL of the proxy.

Así que probamos este ... ¿qué debería hacer?

proxy = { ip: port} 

y debería convertirlos a algún tipo antes de ponerlos en el dict?

r = requests.get(url,headers=headers,proxies=proxy) 
+0

gracias por hacer que se vea más bonita. –

+3

¡y sorprendentemente rápido también! ¿Dónde estaba antes del desbordamiento de la pila? :) –

Respuesta

148

La sintaxis proxies 'dict es {"protocol":"ip:port", ...}. Con él se pueden especificar diferentes (o el mismo) proxie (s) para solicitudes utilizando http, https y ftp protocolos:

http_proxy = "http://10.10.1.10:3128" 
https_proxy = "https://10.10.1.11:1080" 
ftp_proxy = "ftp://10.10.1.10:3128" 

proxyDict = { 
       "http" : http_proxy, 
       "https" : https_proxy, 
       "ftp" : ftp_proxy 
      } 

r = requests.get(url, headers=headers, proxies=proxyDict) 

Deducción respecto del requests documentation:

Parameters:
method – method for the new Request object.
url – URL for the new Request object.
...
proxies – (optional) Dictionary mappingprotocol to the URL of the proxy.
...


En Linux también puede hacerlo a través del entorno HTTP_PROXY, HTTPS_PROXY y FTP_PROXY va riables:

export HTTP_PROXY=10.10.1.10:3128 
export HTTPS_PROXY=10.10.1.11:1080 
export FTP_PROXY=10.10.1.10:3128 

En Windows:

set http_proxy=10.10.1.10:3128 
set https_proxy=10.10.1.11:1080 
set ftp_proxy=10.10.1.10:3128 

, gracias, Jay por señalar esto:
La sintaxis cambiar con solicitudes 2.0.0.
Usted tendrá que añadir un esquema para la url: http://docs.python-requests.org/en/latest/user/advanced/#proxies

+9

es de nuevo! ¡Pronuncias el diamante, muchas gracias otra vez! ¿quieres vivir en mi hombro? : D por cierto, ¿cómo lo sabías? –

+9

@ cigar si StackOverflow es su hombro, entonces ya lo hago;) – chown

+0

@cigar lo sabía porque urllib2 usa el mismo formato exacto para sus proxies dict, y cuando vi http://docs.python-requests.org/en/ Las últimas/api/# solicitudes de módulos dicen "proxies - (opcional) el protocolo de mapeo del diccionario a la URL del proxy.", lo supe enseguida. – chown

2

aquí está mi clase básica en Python para el módulo de peticiones con algunas configuraciones de proxy y cronómetro!

import requests 
import time 
class BaseCheck(): 
    def __init__(self, url): 
     self.http_proxy = "http://user:[email protected]:8080" 
     self.https_proxy = "http://user:[email protected]:8080" 
     self.ftp_proxy = "http://user:[email protected]:8080" 
     self.proxyDict = { 
         "http" : self.http_proxy, 
         "https" : self.https_proxy, 
         "ftp" : self.ftp_proxy 
        } 
     self.url = url 
     def makearr(tsteps): 
      global stemps 
      global steps 
      stemps = {} 
      for step in tsteps: 
       stemps[step] = { 'start': 0, 'end': 0 } 
      steps = tsteps 
     makearr(['init','check']) 
     def starttime(typ = ""): 
      for stemp in stemps: 
       if typ == "": 
        stemps[stemp]['start'] = time.time() 
       else: 
        stemps[stemp][typ] = time.time() 
     starttime() 
    def __str__(self): 
     return str(self.url) 
    def getrequests(self): 
     g=requests.get(self.url,proxies=self.proxyDict) 
     print g.status_code 
     print g.content 
     print self.url 
     stemps['init']['end'] = time.time() 
     #print stemps['init']['end'] - stemps['init']['start'] 
     x= stemps['init']['end'] - stemps['init']['start'] 
     print x 


test=BaseCheck(url='http://google.com') 
test.getrequests() 
13

Puede consultar el proxy documentation here.

Si tiene que usar un proxy, puede configurar peticiones individuales con el argumento de proxies para cualquier método de solicitud:

import requests 

proxies = { 
    "http": "10.10.1.10:3128", 
    "https": "10.10.1.10:1080", 
} 

requests.get("http://example.org", proxies=proxies) 

para utilizar HTTP Basic Auth con su proxy, utilice la sintaxis http://user:[email protected]/:

proxies = { 
    "http": "http://user:[email protected]:3128/" 
} 
20

He encontrado que urllib tiene un código realmente bueno para elegir la configuración del proxy del sistema y que están en la forma correcta para usarlo directamente.Puede usar esto como:

import urllib 

... 
r = requests.get('http://example.org', proxies=urllib.getproxies()) 

Funciona muy bien y urllib sabe cómo obtener las configuraciones de Mac OS X y Windows también.

+0

¿Funciona sin un proxy? Algunos de nuestros usuarios no tienen proxy y algunos tienen. – jonasl

+0

@jonasl Sí , funciona incluso cuando no hay un sistema em proxy definido. En ese caso, es solo un 'dict' vacío. –

+0

¿Incluye no_proxy y las solicitudes respetan no_proxy? No importa, parece que hay soluciones: https://github.com/kennethreitz/requests/issues/879 – jrwren

15

La respuesta aceptada era un buen comienzo para mí, pero me hacía cada vez el siguiente error:

AssertionError: Not supported proxy scheme None 

Fix a esto fue para especificar el http: // en la URL del proxy de este modo:

http_proxy = "http://194.62.145.248:8080" 
https_proxy = "https://194.62.145.248:8080" 
ftp_proxy = "10.10.1.10:3128" 

proxyDict = { 
       "http" : http_proxy, 
       "https" : https_proxy, 
       "ftp" : ftp_proxy 
      } 

Me interesaría saber por qué el original funciona para algunas personas pero no para mí.

Editar: Veo que la respuesta principal ahora se ha actualizado para reflejar esto :)

+0

También tuve el mismo problema y tu respuesta lo solucionó. Parece extraño. – stackunderflow

+3

cambiado con 2.0.0: las URL proxy ahora deben tener un esquema explícito. Se generará una excepción MissingSchema si no lo hacen. – Jannis

Cuestiones relacionadas