Proxies con el módulo de ‘Solicitudes’ de Python

Solo un breve y sencillo sobre el excelente módulo de solicitudes para Python.

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

Los documentos mencionan esto solamente:

proxies – (opcional) Protocolo de mapeo del diccionario a la URL del proxy.

Así que intenté esto … ¿Qué debería estar haciendo?

proxy = { ip: port} 

¿Debería convertirlos a algún tipo antes de colocarlos en el dict?

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

La syntax dict de los proxies es {"protocol":"ip:port", ...} . Con él puede especificar diferentes (o los mismos) proxie (s) para las solicitudes utilizando los protocolos http , https y ftp :

 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) 

Deducido de la documentación de requests :

Parámetros:
method – método para el nuevo objeto de solicitud.
url – URL para el nuevo objeto de solicitud.

proxies – (opcional) Protocolo de mapeo del diccionario a la URL del proxy .


En Linux también puede hacer esto a través de las variables de entorno HTTP_PROXY , HTTPS_PROXY y FTP_PROXY :

 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 syntax cambió con las peticiones 2.0.0 .
Deberá agregar un esquema a la url: http://docs.python-requests.org/en/latest/user/advanced/#proxies

Descubrí que urllib tiene un código realmente bueno para seleccionar la configuración del proxy del sistema y que están en la forma correcta para usar directamente. Puedes usar esto como:

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

Funciona realmente bien y urllib sabe acerca de cómo obtener la configuración de Mac OS X y Windows también.

Puede consultar la documentación del proxy aquí .

Si necesita usar un proxy, puede configurar solicitudes individuales con el argumento de los proxies a cualquier método de solicitud:

 import requests proxies = { "http": "http://10.10.1.10:3128", "https": "https://10.10.1.10:1080", } requests.get("http://example.org", proxies=proxies) 

Para usar la autenticación básica HTTP con su proxy, use http: // usuario: password@host.com/ syntax:

 proxies = { "http": "http://user:pass@10.10.1.10:3128/" } 

La respuesta aceptada fue un buen comienzo para mí, pero seguí recibiendo el siguiente error:

 AssertionError: Not supported proxy scheme None 

Arreglar esto fue especificar http: // en la url del proxy, por lo tanto:

 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í.

Edición: veo que la respuesta principal ahora está actualizada para reflejar esto 🙂

¡Aquí está mi clase básica en python para el módulo de solicitudes con algunas configuraciones de proxy y cronómetro!

 import requests import time class BaseCheck(): def __init__(self, url): self.http_proxy = "http://user:pw@proxy:8080" self.https_proxy = "http://user:pw@proxy:8080" self.ftp_proxy = "http://user:pw@proxy: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() 

Si desea conservar las cookies y los datos de sesión, es mejor que lo haga así:

 import requests proxies = { 'http': 'http://user:pass@10.10.1.0:3128', 'https': 'https://user:pass@10.10.1.0:3128', } # Create the session and set the proxies. s = requests.Session() s.proxies = proxies # Make the HTTP request through the session. r = s.get('http://www.showmemyip.com/') 

Es un poco tarde, pero aquí hay una clase de envoltorio que simplifica los proxies de raspado y luego hace un HTTP POST o GET:

Solicitudes de Proxy

 https://github.com/rootVIII/proxy_requests 

acabo de hacer un proxy graber y también puedo conectarme con el mismo proxy capturado sin ninguna entrada aquí:

 #Import Modules from termcolor import colored from selenium import webdriver import requests import os import sys import time #Proxy Grab options = webdriver.ChromeOptions() options.add_argument('headless') driver = webdriver.Chrome(chrome_options=options) driver.get("https://www.sslproxies.org/") tbody = driver.find_element_by_tag_name("tbody") cell = tbody.find_elements_by_tag_name("tr") for column in cell: column = column.text.split(" ") print(colored(column[0]+":"+column[1],'yellow')) driver.quit() print("") os.system('clear') os.system('cls') #Proxy Connection print(colored('Getting Proxies from graber...','green')) time.sleep(2) os.system('clear') os.system('cls') proxy = {"http": "http://"+ column[0]+":"+column[1]} url = 'https://mobile.facebook.com/login' r = requests.get(url, proxies=proxy) print("") print(colored('Connecting using proxy' ,'green')) print("") sts = r.status_code