2011-11-27 6 views
83

Un breve, semplice sull'eccellente modulo Requests per Python.Proxy con il modulo 'Richieste' di Python

Non riesco a trovare nella documentazione ciò che la variabile 'proxy' dovrebbe contenere. Quando gli mando un dict con un valore "IP: PORT" standard, lo ha rifiutato chiedendo 2 valori. Quindi, suppongo (perché questo non sembra essere trattato nei documenti) che il primo valore è l'ip e il secondo la porta?

I documenti menzionano questo solo:

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

Così ho provato questa ... cosa dovrei fare?

proxy = { ip: port} 

e dovrei convertirli in qualche tipo prima di inserirli in dict?

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

grazie per aver reso questo aspetto più carino. –

+3

e sorprendentemente veloce! dove ero prima dello stack overflow? :) –

risposta

148

La sintassi proxies 'dict è {"protocol":"ip:port", ...}. Con esso è possibile specificare proxie diverso (o lo stesso) (s) per le richieste che utilizzano http, https, e ftp protocolli:

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) 

desunto dalle 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.
...


Su linux è anche possibile farlo tramite HTTP_PROXY, HTTPS_PROXY e FTP_PROXY ambiente va VARIABILI:

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

Su 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 

Grazie, Jay per la precisazione:
La sintassi cambiate con richieste 2.0.0.
Avrete bisogno di aggiungere uno schema alla url: http://docs.python-requests.org/en/latest/user/advanced/#proxies

+9

di nuovo tu !!!! tu ti spaccano il diamante, molte grazie ancora! vuoi vivere sulla mia spalla? : D btw - come lo sapevi? –

+9

@cigar se StackOverflow è la tua spalla, quindi lo faccio già;) – chown

+0

@cigar Lo sapevo perché urllib2 utilizza lo stesso formato esatto per i loro proxy dettati, e quando ho visto http://docs.python-requests.org/en/ latest/api/# module-requests dice "proxy" (facoltativo) Dictionary mapping protocol all'URL del proxy. ", lo sapevo subito. – chown

2

qui è la mia classe di base in Python per il modulo di richiesta con alcune configurazioni proxy e cronometro!

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

È possibile fare riferimento allo proxy documentation here.

Se è necessario utilizzare un proxy, è possibile configurare le richieste individuali con l'argomento deleghe a qualsiasi metodo di richiesta:

import requests 

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

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

Per utilizzare HTTP Auth di base con il proxy, utilizzare la http://user:[email protected]/ sintassi:

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

Ho trovato che urllib ha un codice veramente buono per raccogliere le impostazioni del proxy del sistema e capita di essere nella forma corretta da usare direttamente.Puoi usare questo:

import urllib 

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

Funziona molto bene e urllib sa anche come ottenere le impostazioni di Mac OS X e Windows.

+0

Funziona senza proxy Alcuni dei nostri utenti non hanno proxy e alcuni lo hanno. – jonasl

+0

@jonasl Sì , funziona anche quando non c'è un sistema em proxy definito. In tal caso, è solo un 'dict 'vuoto. –

+0

Include no_proxy e le richieste rispettano no_proxy? Non importa, ci sono soluzioni: https://github.com/kennethreitz/requests/issues/879 – jrwren

15

La risposta accettata è stato un buon inizio per me, ma ho continuato a ottenere il seguente errore:

AssertionError: Not supported proxy scheme None 

Fix per questo è stato per specificare il http: // nell'URL delega in tal 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 
      } 

Sarei interessato al motivo per cui l'originale funziona per alcune persone ma non per me.

Modifica: Vedo che la risposta principale è ora aggiornata per riflettere questo :)

+0

Ho avuto lo stesso problema e la tua risposta l'ha risolto. Sembra strano. – stackunderflow

+3

modificato con 2.0.0: gli URL proxy ora devono avere uno schema esplicito. Se non lo fanno, verrà sollevata un'eccezione MissingSchema. – Jannis