Proxies con el módulo 'Solicitudes' de Python

159

Solo una breve y simple sobre el excelente módulo de Solicitudes para Python.

Parece que no puedo encontrar en la documentación qué debería contener la variable 'proxies'. Cuando le envié un dict 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 solo mencionan esto:

proxies: (opcional) Protocolo de asignación de diccionario a la URL del proxy.

Así que intenté esto ... ¿qué debería hacer?

proxy = { ip: port}

¿y debo convertirlos a algún tipo antes de ponerlos en el dict?

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

Respuestas:

281

La proxiessintaxis 'dict es {"protocol":"ip:port", ...}. Con él, puede especificar diferentes servidores proxy (o los mismos) para 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 requestsdocumentación :

Parámetros:
method - método para el nuevo objeto Solicitud.
url- URL para el nuevo objeto Solicitud.
...
proxies- (opcional) Protocolo de asignación de diccionario a la URL del proxy . ...


En Linux también puede hacerlo a través de los HTTP_PROXY, HTTPS_PROXYy FTP_PROXYvariables de entorno:

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: https://2.python-requests.org/en/latest/user/advanced/#proxies

chown
fuente
@cigar Lo sabía porque urllib2 usa exactamente el mismo formato para sus dict proxies, y cuando vi docs.python-requests.org/en/latest/api/#module-requests dicen "proxies - (opcional) Protocolo de mapeo de diccionario al URL del proxy ", lo supe de inmediato.
vestido el
1
ahhh ya veo, nunca usé proxies con urllib2 debido a los consejos para deshacerme de él obtenidos de aquí, reemplacé 2 páginas de código con 8 líneas: / re: hombro :))) gran estancia aquí, ya me has ahorrado horas en ¡total! si alguna vez necesitas ayuda con la música, dame un grito, sobre el que pueda darte consejos, de lo contrario, no puedo pensar en otra forma de pagar que no sea gracias masivas o tazas de té.
Parece solicitudes y, además, urllib3 no puede hacer una CONEXIÓN cuando se utiliza un proxy :(
dzen
@dzen Todavía no lo he usado, urllib3así que tendré que investigar eso. Gracias por el aviso.
chown
3
@chown la sintaxis cambió con las solicitudes 2.0.0. Tendrá que agregar un esquema a la url: docs.python-requests.org/en/latest/user/advanced/#proxies Sería bueno si pudiera agregar esto a su respuesta aquí
Jay
28

He descubierto que urllib tiene un código realmente bueno para recoger la configuración de proxy del sistema y 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 muy bien y urllib también sabe cómo obtener la configuración de Mac OS X y Windows.

Ben Golding
fuente
¿Funciona sin un proxy? Algunos de nuestros usuarios no tienen proxy y otros sí.
jonasl
1
¿Incluye no_proxy y las solicitudes respetan no_proxy? No importa, parece que hay soluciones: github.com/kennethreitz/requests/issues/879
jrwren
44
errar:module 'urllib' has no attribute 'getproxies'
Zahra
44
Verdoso: urllib.request.getproxies ()
oliche
1
@Zahra pruebe urllib2.getproxies ()
rleelr
25

Puede consultar la documentación del proxy aquí .

Si necesita usar un proxy, puede configurar solicitudes individuales con el argumento proxies para 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 HTTP Basic Auth con su proxy, use la sintaxis http: // user: [email protected]/ :

proxies = {
    "http": "http://user:[email protected]:3128/"
}
Zhifeng Hu
fuente
17

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

AssertionError: Not supported proxy scheme None

La solución a esto fue 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 se actualiza para reflejar esto :)

Owen B
fuente
44
cambiado con 2.0.0: las URL de proxy ahora deben tener un esquema explícito. Se generará una excepción MissingSchema si no lo hacen.
Jay
4

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

import requests

proxies = {
    'http': 'http://user:[email protected]:3128',
    'https': 'https://user:[email protected]: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/')
Usuario
fuente
2

8 años de retraso. Pero me gusta:

import os
import requests

os.environ['HTTP_PROXY'] = os.environ['http_proxy'] = 'http://http-connect-proxy:3128/'
os.environ['HTTPS_PROXY'] = os.environ['https_proxy'] = 'http://http-connect-proxy:3128/'
os.environ['NO_PROXY'] = os.environ['no_proxy'] = '127.0.0.1,localhost,.local'

r = requests.get('https://example.com')  # , verify=False
qräbnö
fuente
1

¡Aquí está mi clase básica en Python para el módulo de solicitudes con algunas configuraciones 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()
mtt2p
fuente
1

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

#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
Rae mh
fuente
0

Es un poco tarde, pero aquí hay una clase de contenedor que simplifica el proxy de raspado y luego hace un HTTP POST o GET:

Solicitudes de proxy

https://github.com/rootVIII/proxy_requests

fuente
0

Comparto algunos códigos sobre cómo obtener proxies del sitio "https://free-proxy-list.net" y almacenar datos en un archivo compatible con herramientas como "Elite Proxy Switcher" (formato IP: PUERTO):

## PROXY_UPDATER - obtén proxies gratis de https://free-proxy-list.net/

from lxml.html import fromstring
import requests
from itertools import cycle
import traceback
import re

######################FIND PROXIES#########################################
def get_proxies():
    url = 'https://free-proxy-list.net/'
    response = requests.get(url)
    parser = fromstring(response.text)
    proxies = set()
    for i in parser.xpath('//tbody/tr')[:299]:   #299 proxies max
        proxy = ":".join([i.xpath('.//td[1]/text()') 
        [0],i.xpath('.//td[2]/text()')[0]])
        proxies.add(proxy)
    return proxies



######################write to file in format   IP:PORT######################
try:
    proxies = get_proxies()
    f=open('proxy_list.txt','w')
    for proxy in proxies:
        f.write(proxy+'\n')
    f.close()
    print ("DONE")
except:
    print ("MAJOR ERROR")
Lambov
fuente