En los rastreadores de Python 3, usar un proxy es un método común para evitar que la IP sea bloqueada o para aumentar la velocidad de rastreo. Se utiliza principalmente para simular acceso desde múltiples direcciones IP. Los proxies se pueden dividir en proxies gratuitos y de pago; los gratuitos son inestables, mientras que los de pago son relativamente más estables y fiables.

A continuación se muestran los escenarios de uso y aplicaciones de los proxies para crawlers en Python3:

Evitar que la IP sea bloqueada: algunos sitios web establecen límites de frecuencia de acceso por IP. Si el número de accesos supera el límite, esa IP quedará prohibida para acceder al sitio; usar un proxy puede evitar que esto ocurra.

Mejorar la velocidad de rastreo: usar un proxy permite establecer varias conexiones al mismo tiempo, logrando así recopilar rápidamente los datos objetivo.

Omitir restricciones geográficas: algunos sitios web ofrecen servicios distintos según la región. Si necesitas acceder a sitios que solo están abiertos para zonas concretas, usar un proxy puede sortear esta limitación y permitirte obtener los datos que necesitas.

En resumen, la IP proxy desempeña un papel muy importante en el scraping con Python 3. Debido a que el uso de proxies también puede introducir algunos problemas de seguridad, al usarlos es necesario prestar atención a elegir un proveedor de proxies adecuado y cumplir estrictamente las normas de ciberseguridad.

Preparación

Primero necesitamos obtener un proxy disponible; un proxy es la combinación de una dirección IP y un puerto, es decir, ip:puerto Este formato. Si el proxy requiere autenticación de acceso, también se necesitarán dos datos adicionales: nombre de usuario y contraseña.

Aquí tengo instalado en mi equipo un software proxy, que crea un servicio proxy HTTP en el puerto local 7890, es decir, el proxy es 127.0.0.1:7890. Además, ese software también crea un servicio proxy SOCKS en el puerto 7891, es decir, el proxy es 127.0.0.1:7891; por lo tanto, mientras configures este proxy, podrás cambiar con éxito la IP de este equipo a la IP del servidor al que se conecta el software proxy.

En los ejemplos de este capítulo, usaré el proxy anterior para mostrar cómo se configura; también puedes sustituirlo por tu propio proxy disponible.

Después de configurar el proxy, el sitio que se prueba es http://httpbin.org/get Al acceder a este enlace podemos obtener la información relacionada con la solicitud; entre los resultados devueltos, el campo `origin` es la IP del cliente. Podemos usarlo para determinar si el proxy se configuró correctamente, es decir, si la IP se ha falsificado con éxito.

Bien, a continuación veremos los métodos de configuración de proxy para cada biblioteca de solicitudes.

Obtener un proxy para scraping en Python3

Algunos sitios web detectan el acceso frecuente a sus datos y toman medidas para bloquearlo. Usar un servidor proxy puede distribuir el origen de los accesos, reducir la probabilidad de detección y, con ello, aumentar la tasa de éxito del scraping.

Mejores IP proxy estáticas de EE. UU.

IPRoyal es un proveedor de servicios de proxy extremadamente amigable con la región de China; su solución de proxies residenciales es muy atractiva

Ver IPRoyal
El proxy estático más barato

Proxy-seller es un proveedor de proxies de centros de datos, muy popular entre muchos pequeños profesionales del marketing por Internet.

Ver Proxy-seller
El proxy estático más asequible

Shifter.io es un conocido proveedor de servicios de proxy, diseñado para ofrecer a los usuarios protección de la privacidad y una mejor experiencia de Internet.

Ver Shifter.io

2. urllib

Primero tomamos como ejemplo el `urllib` más básico para ver el método de configuración del proxy; el código es el siguiente:

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = '127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 opener = build_opener(proxy_handler)
 try:
    response = opener.open('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Los resultados de ejecución son los siguientes:

 {
  "args": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Host": "httpbin.org",
    "User-Agent": "Python-urllib/3.7",
    "X-Amzn-Trace-Id": "Root=1-60e9a1b6-0a20b8a678844a0b2ab4e889"
  },
  "origin": "210.173.1.204",
  "url": "https://httpbin.org/get"
 }
 

Aquí necesitamos usar `ProxyHandler` para configurar el proxy. El parámetro es de tipo diccionario, la clave es el tipo de protocolo y el valor es el proxy. Ten en cuenta que aquí, delante del proxy, hay que añadir el protocolo, es decir, http:// o https://, cuando el enlace solicitado sea del protocolo HTTP, se usará el proxy correspondiente a la clave http; cuando el enlace solicitado sea del protocolo HTTPS, se usará el proxy correspondiente a la clave https. Sin embargo, aquí hemos configurado el proxy en sí como protocolo HTTP, es decir, el prefijo se ha unificado en http://Por eso, tanto si accedemos a enlaces con protocolo HTTP como HTTPS, las solicitudes se harán usando el proxy HTTP que hemos configurado.

Después de crear el objeto ProxyHandler, necesitamos usar el método build_opener para pasarle ese objeto y crear un Opener; así, ese Opener ya tendrá el proxy configurado. A continuación, basta con llamar directamente al método open del objeto Opener para acceder al enlace que queremos.

El resultado de la ejecución es un JSON con un campo origin, que indica la IP del cliente. Compruébalo: aquí la IP efectivamente es la IP del proxy, no la IP real. Así hemos configurado correctamente el proxy y podemos ocultar la IP real.

Si nos encontramos con un proxy que requiere autenticación, podemos configurarlo de la siguiente manera:

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = 'username:password@127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 opener = build_opener(proxy_handler)
 try:
    response = opener.open('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Aquí lo único que cambia es la variable proxy; solo hay que añadir delante del proxy el usuario y la contraseña de autenticación. Aquí username es el nombre de usuario y password es la contraseña. Por ejemplo, si username es foo y la contraseña es bar, entonces el proxy es foo:bar@127.0.0.1:7890

Si el proxy es de tipo SOCKS5, se puede configurar de la siguiente manera:

 import socks
 import socket
 from urllib import request
 from urllib.error import URLError

 socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 7891)
 socket.socket = socks.socksocket
 try:
    response = request.urlopen('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Aquí se necesita un módulo socks, que se puede instalar con el siguiente comando:

 pip3 install PySocks