Volver al blog

Cómo usar un proxy con PowerShell Invoke-WebRequest

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

17-Dec-2025
Echa un vistazo rápido

Domina la configuración del proxy de PowerShell para solicitudes web seguras y anónimas. Redirige el tráfico a través de proxies residenciales para evadir restricciones geográficas y evitar bloqueos de IP.

Puntos clave

  • El parámetro -Proxy de Invoke-WebRequest permite enrutar el tráfico a través de servidores proxy
  • PowerShell 7.x admite proxies HTTPS y SOCKS; versiones anteriores solo admiten HTTP
  • El parámetro ProxyCredential maneja la autenticación cuando los proxies requieren credenciales de inicio de sesión
  • Los proxies residenciales proporcionan IP asignadas legítimamente por ISP que evitan bloqueos basados en IP
  • Los objetos de sesión mantienen automáticamente la configuración del proxy a través de múltiples solicitudes

Entendiendo los proxies de Invoke-WebRequest

Invoke-WebRequest es el cmdlet nativo de PowerShell para realizar solicitudes HTTP y HTTPS. El parámetro -Proxy enruta las solicitudes a través de servidores proxy especificados en lugar de conectarse directamente a los sitios web de destino. Esta capacidad permite a los scripts:

  • Acceder a contenido restringido geográficamente desde ubicaciones específicas
  • Distribuir solicitudes a través de múltiples IPs para evitar limitación de tasas
  • Ocultar los orígenes de los scripts de los sitios web de destino
  • Probar la conectividad de red a través de proxies corporativos

El parámetro proxy acepta URLs en el formato: <PROTOCOL>://<HOST>:<PORT>

Configuración básica de proxy HTTP

La configuración de proxy más simple especifica una dirección y un puerto HTTP:

powershell Copy
$proxyUrl = "http://47.252.29.28:11222"
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" -Proxy $proxyUrl
Write-Output $response.Content

Este comando enruta la solicitud a través del servidor proxy especificado. El sitio web de destino recibe la solicitud desde la dirección IP del proxy en lugar de la dirección IP de tu computadora.

Autenticación del proxy

Muchos proveedores de proxies requieren autenticación para prevenir el uso no autorizado. El parámetro -ProxyCredential pasa nombre de usuario y contraseña:

powershell Copy
$proxyUrl = "http://proxy.example.com:8080"
$proxyCreds = Get-Credential
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" `
    -Proxy $proxyUrl `
    -ProxyCredential $proxyCreds

Get-Credential abre un aviso interactivo solicitando credenciales. Para scripts automatizados, crea credenciales programáticamente:

powershell Copy
$username = "proxy_user"
$password = "proxy_password"
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force
$proxyCreds = New-Object System.Management.Automation.PSCredential `
    -ArgumentList $username, $secPassword

$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" `
    -Proxy "http://proxy.example.com:8080" `
    -ProxyCredential $proxyCreds

URL de proxy con credenciales integradas

Alternativamente, integra credenciales directamente en la URL del proxy:

powershell Copy
$proxyUrl = "http://username:password@proxy.example.com:8080"
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" -Proxy $proxyUrl

Este enfoque resulta conveniente para scripts donde la gestión de credenciales es menos crítica.

Soporte para proxies HTTPS y SOCKS

PowerShell 7.x+ añade soporte para proxies HTTPS y SOCKS. Si usas versiones anteriores, solo funcionan los proxies HTTP. Actualiza a PowerShell 7 para obtener soporte completo del protocolo proxy:

powershell Copy
# Proxy HTTPS
$response = Invoke-WebRequest -Uri "https://example.com" `
    -Proxy "https://username:password@proxy.example.com:8080"

# Proxy SOCKS5
$response = Invoke-WebRequest -Uri "https://example.com" `
    -Proxy "socks5://username:password@proxy.example.com:1080"

Verifica tu versión de PowerShell:

powershell Copy
$PSVersionTable.PSVersion

Estrategia de rotación de proxies

Para scraping a gran escala o llamadas a APIs, rotar entre múltiples proxies distribuye solicitudes a través de diferentes IPs, evitando límites de tasa y bloqueos de IP:

powershell Copy
$proxyList = @(
    "http://user:pass@proxy1.example.com:8080",
    "http://user:pass@proxy2.example.com:8080",
    "http://user:pass@proxy3.example.com:8080"
)

$urls = @(
    "https://api.example.com/page1",
    "https://api.example.com/page2",
    "https://api.example.com/page3"
)

foreach ($url in $urls) {
    $randomProxy = $proxyList | Get-Random
    $response = Invoke-WebRequest -Uri $url -Proxy $randomProxy
    Write-Output "Respuesta de $url usando $randomProxy"
}

Este enfoque selecciona aleatoriamente un proxy diferente para cada solicitud, previniendo la acumulación de solicitudes por IP que desencadena bloqueos.

Proxies residenciales premium con PowerShell

Proxys Residenciales Scrapeless proporcionan infraestructura de proxy de calidad profesional para la automatización de PowerShell. Los proxies residenciales utilizan IPs legítimas asignadas por ISP, mejorando drásticamente las tasas de éxito contra sitios web protegidos:

powershell Copy
# Proxy residencial Scrapeless con autenticación
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"

$headers = @{
    'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

$response = Invoke-WebRequest -Uri "https://example.com" `
    -Proxy $proxyUrl `
    -Headers $headers

Write-Output $response.StatusCode

Scrapeless gestiona más de 90 millones de IP residenciales en más de 195 países con rotación automática y segmentación geográfica.

Configuración de Proxy Basada en Sesiones

Para múltiples solicitudes relacionadas, los objetos de sesión mantienen automáticamente la configuración del proxy:

powershell Copy
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"
$webSession = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$webSession.Proxy = New-Object System.Net.WebProxy($proxyUrl)

# Primera solicitud
$response1 = Invoke-WebRequest -Uri "https://example.com/page1" `
    -WebSession $webSession

# Segunda solicitud utiliza automáticamente el mismo proxy
$response2 = Invoke-WebRequest -Uri "https://example.com/page2" `
    -WebSession $webSession

# Tercera solicitud con la misma configuración del proxy
$response3 = Invoke-WebRequest -Uri "https://example.com/page3" `
    -WebSession $webSession

Los objetos de sesión eliminan la especificación repetitiva del proxy para solicitudes secuenciales.

Listas de Exclusión de Proxy

Algunos entornos requieren conexiones directas a hosts específicos, evitando proxies. Defina listas de exclusión para acceso directo:

powershell Copy
$proxy = New-Object System.Net.WebProxy("http://proxy.example.com:8080")
$proxy.BypassList += "*.internal.company.com"
$proxy.BypassList += "localhost"

[System.Net.WebRequest]::DefaultWebProxy = $proxy

$response = Invoke-WebRequest -Uri "https://internal.company.com"

Los hosts excluidos se conectan directamente en lugar de pasar por el servidor proxy.

Manejo de Errores de Certificado SSL

Algunas configuraciones de proxy o certificados autofirmados causan errores de SSL. Para propósitos de prueba, omita la validación de certificados:

powershell Copy
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

$response = Invoke-WebRequest -Uri "https://example.com" `
    -Proxy "http://proxy.example.com:8080"

Advertencia: Deshabilitar la validación de certificados te expone a ataques de tipo hombre en el medio. Úselo solo en entornos controlados.

PowerShell 7.4+ proporciona el parámetro más seguro -SkipCertificateCheck:

powershell Copy
$response = Invoke-WebRequest -Uri "https://example.com" `
    -Proxy "http://proxy.example.com:8080" `
    -SkipCertificateCheck

Caso de Uso Avanzado: Web Scraping con Proxies

Combine proxies residenciales con encabezados adecuados y retrasos para un scraping web eficaz:

powershell Copy
function Invoke-ScrapingRequest {
    param(
        [Parameter(Mandatory=$true)]
        [string]$Url,
        
        [Parameter(Mandatory=$true)]
        [string]$ProxyUrl,
        
        [int]$DelayMs = 2000
    )
    
    $headers = @{
        'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        'Accept' = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
        'Accept-Language' = 'es-ES,es;q=0.9'
    }
    
    Start-Sleep -Milliseconds $DelayMs
    
    $response = Invoke-WebRequest -Uri $Url `
        -Proxy $ProxyUrl `
        -Headers $headers `
        -ErrorAction SilentlyContinue
    
    return $response
}

# Uso
$proxyUrl = "http://user:pass@superproxy.scrapeless.com:1337"
$response = Invoke-ScrapingRequest -Url "https://example.com" -ProxyUrl $proxyUrl

Este patrón implementa retrasos en las solicitudes entre llamadas, encabezados que imitan navegadores legítimos y rotación de proxies residenciales para scraping a gran escala fiable.

Solución de Problemas con Proxies

Conexión Rechazada: Verifique el host y el puerto del proxy. Pruebe la conectividad directamente:

powershell Copy
Test-NetConnection -ComputerName "proxy.example.com" -Port 8080

Autenticación Fallida: Confirme que el nombre de usuario y la contraseña sean correctos. Las credenciales incrustadas en las URL requieren codificación de URL si contienen caracteres especiales.

Rendimiento Lento: Pruebe diferentes proxies si están disponibles. Algunos proxies pueden estar geográficamente distantes o congestionados.

Proxy No Usado: Verifique que Invoke-WebRequest utilice el parámetro -Proxy. Las variables de entorno o la configuración del proxy del sistema no afectan automáticamente a Invoke-WebRequest.

Proxies de Variables de Entorno

PowerShell 7.x+ respeta las variables de entorno HTTP_PROXY y HTTPS_PROXY si están configuradas:

powershell Copy
$env:HTTP_PROXY = "http://proxy.example.com:8080"
$env:HTTPS_PROXY = "http://proxy.example.com:8080"

$response = Invoke-WebRequest -Uri "https://example.com"

Las versiones anteriores de PowerShell ignoran las variables de entorno; especifique explícitamente el parámetro -Proxy.

Llamadas a la API REST a Través de Proxies

El cmdlet Invoke-RestMethod similar también acepta el parámetro -Proxy para llamadas a API JSON:

powershell Copy
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"

$response = Invoke-RestMethod -Uri "https://api.example.com/data" `
    -Proxy $proxyUrl `
    -Method Get

$response | ConvertTo-Json

Preguntas Frecuentes

P: ¿Puedo usar Invoke-WebRequest sin especificar un proxy?

R: Sí. Omitir el parámetro -Proxy para conexiones directas. Sin embargo, esto expone su dirección IP real y evita eludir restricciones geográficas o límites de tasa.

P: ¿Cuántas llamadas concurrentes de Invoke-WebRequest puedo hacer a través de un proxy?

R: PowerShell limita las operaciones concurrentes en función de los recursos del sistema. La mayoría de los scripts ejecutan con éxito de 10 a 50 solicitudes paralelas. Los proxies residenciales premium como Scrapeless admiten una concurrencia ilimitada a nivel de infraestructura del proxy.

P: ¿Cuál es la diferencia entre los parámetros -Proxy y -ProxyCredential?

R: El parámetro -Proxy especifica la dirección del servidor proxy. El parámetro -ProxyCredential proporciona credenciales de autenticación por separado de la URL, útil cuando las credenciales contienen caracteres especiales que requerirían codificación de URL.

P: ¿Necesito permisos elevados para usar proxies con Invoke-WebRequest?

R: No. El uso de proxies solo requiere conectividad de red al servidor proxy. No se necesitan privilegios de administrador para operaciones de proxy estándar.

P: ¿Puede Invoke-WebRequest funcionar con proxies SOCKS en Windows PowerShell 5.1?

R: No. Windows PowerShell 5.1 solo admite proxies HTTP. Actualice a PowerShell 7.x para acceder al soporte de proxies SOCKS. Descargue PowerShell 7 desde el repositorio oficial de Microsoft; se instala junto a Windows PowerShell sin conflictos.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar