how - requests post python
Módulo Proxies con Python ''Solicitudes'' (5)
¡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()
Solo uno breve y simple sobre el excelente módulo de Requests para Python.
Parece que no puedo encontrar en la documentación qué 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 solo mencionan esto:
proxies - (opcional) Protocolo de mapeo del diccionario a la URL del proxy.
Así que probé esto ... ¿qué debería estar haciendo?
proxy = { ip: port}
¿Debería convertirlos a algún tipo antes de ponerlos en el dict?
r = requests.get(url,headers=headers,proxies=proxy)
Descubrí que urllib tiene un código realmente bueno para elegir la configuración de proxy del sistema y que están en la forma correcta para usarlo directamente. Puedes usar esto como:
import urllib
...
r = requests.get(''http://example.org'', proxies=urllib.getproxies())
Funciona muy bien y urllib también sabe cómo configurar Mac OS X y Windows.
La respuesta aceptada fue un buen comienzo para mí, pero seguí recibiendo el siguiente error:
AssertionError: Not supported proxy scheme None
La solución a esto era especificar http: // en la url del proxy de esta manera:
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 está actualizada para reflejar esto :)
La sintaxis dict de los proxies
es {"protocol":"ip:port", ...}
. Con él, puede especificar diferentes (o la misma) proxie (s) para las solicitudes que utilizan 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 Solicitud.
url
: URL del nuevo objeto de solicitud.
...
proxies
- (opcional) Protocolo de mapeo del diccionario a la URL del proxy .
...
En Linux, también puede hacerlo 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 sintaxis cambió con las solicitudes 2.0.0 .
Deberá agregar un esquema a la url: http://docs.python-requests.org/en/latest/user/advanced/#proxies
Puede consultar la http://docs.python-requests.org/en/latest/user/advanced/#proxies del http://docs.python-requests.org/en/latest/user/advanced/#proxies .
Si necesita usar un proxy, puede configurar solicitudes 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 usar HTTP Basic Auth con su proxy, use la sintaxis http://user:[email protected]/ :
proxies = {
"http": "http://user:[email protected]:3128/"
}