1.1K
El Invocar-WebRequest cmdlet es un comando en PowerShell que le permite enviar solicitudes HTTP y HTTPS a servidores web y recuperar la respuesta. Se utiliza principalmente para raspado web, automatización de tareas web e interacción con API basadas en web.
Con Invocar-WebRequest, puede realizar varias acciones, como descargar contenido web, enviar formularios, enviar encabezados, manejar cookies y más. Proporciona una forma de interactuar con páginas web y recuperar HTML u otros datos de ellas.
Invoke-WebRequest: conceptos básicos
Este cmdlet se introdujo en Windows PowerShell 3.0. Tiene diferentes alias según la edición de PowerShell que esté utilizando.
En Windows PowerShell, el Invocar-WebRequest Los alias de cmdlet son rizo, iwry wget.
En PowerShell Core, el alias se limita a iwr.
El uso básico de Invocar-WebRequest está recuperando la página web. La única información requerida es la URL.
Invoke-WebRequest -Uri <website URL>
Por ejemplo, descargaré el sitio web https://theitbros.com y lo guardaré en el $web variable.
Nota. Si el comando se bloqueó al usar Windows PowerShell, agregue el -UseBasicParsing cambiar:
$web = Invoke-WebRequest -Uri https://theitbros.com -UseBasicParsing
A continuación, averigüemos el tipo de datos resultante:
$web.GetType()
El objeto resultante es un BasicHtmlWebResponseObject tipo de datos.
¿Qué propiedades tiene este objeto?
$web | Get-Member -MemberType Properties
Ya puede adivinar por las propiedades enumeradas en la captura de pantalla anterior el tipo de datos que puede obtener de cada propiedad.
por ejemplo, el Contenido La propiedad contiene el código HTML de la página web. Mientras que la Contenido sin procesar La propiedad también incluye el código HTML, incluidos los encabezados.
El Imágenes y Enlaces Las propiedades contienen información sobre las imágenes y enlaces en el sitio web.
Raspado web
raspado web se refiere al proceso automatizado de extracción de información o datos de sitios web. Implica escribir código para recuperar datos específicos de páginas web y guardarlos en un formato estructurado, como una hoja de cálculo o una base de datos.
Web scraping le permite recopilar datos de múltiples fuentes de forma rápida y eficiente sin necesidad de copiar y pegar manualmente.
Usando Invocar-WebRequest, o cualquier otra herramienta, para hacer web scraping no es un proceso único para todos. Necesita paciencia, además de sus habilidades de análisis de código.
Nota. Los siguientes ejemplos de wed-scraping usando Invocar-WebRequest funciona a partir de este escrito. Sin embargo, eventualmente puede dejar de funcionar cuando los sitios web de destino cambien.
Ejemplo: extraer el título del artículo y los enlaces
Supongamos que quiero obtener una lista de todos los artículos que se muestran en la página de inicio de https://theitbros.com.
Lo primero que haré será ejecutar el siguiente comando para almacenar la página web en una variable:
$s = Invoke-WebRequest -Uri https://theitbros.com
A continuación, inspeccionaré qué propiedades puedo usar:
$s.Links | Get-Member -MemberType Properties
De acuerdo con la captura de pantalla a continuación, las propiedades son:
- href — contiene la dirección URL simple.
- exteriorHTML — contiene el código de hipervínculo HTML.
- etiquetaNombre — la etiqueta HTML de la propiedad href.
Ahora que conozco las propiedades, simplemente puedo ejecutar el siguiente comando para obtener todas las URL.
$s.Links | Select-Object href
Como puede ver arriba, el href La propiedad enumera todas las URL que se encuentran en el sitio web, incluidos los enlaces a artículos que no son. Entonces necesito filtrar algunas URL que no son relevantes.
Cuando analicé las URL, me di cuenta de que necesitaba excluir la siguiente:
- La URL raíz del sitio web: https://theitbros.com/
- URL con estas partes:
- /Sobre los autores/
- /categoría/
- /Contáctenos/
- Etiquetas HTML A que no comienzan con:
El siguiente código traduce esa lógica en un filtro de PowerShell usando Donde-Objeto.
$s.Links | Where-Object { $_.href -ne "https://theitbros.com/" -and $_.href -notlike "*/privacy-policy/*" -and $_.href -notlike "*/category/*" -and $_.href -notlike "*/author/*" -and $_.href -notlike "*/about-the-authors/*" -and $_.href -notlike "*/contact-us/*" -and $_.outerHTML -like "<a href=`"https://theitbros.com*" }
Cuando ejecuté el comando anterior, obtuve el siguiente resultado.
En este punto, el resultado es más claro. Pero solo quiero raspar el título del artículo y la URL. En este caso, necesito extraer el título entre el > y < caracteres. Con eso en mente, usaré una coincidencia RegEx usando este patrón: ‘>(.*?)<'.
A continuación se muestra el código actualizado.
# Get TrucosInformaticos.com article links ## Store the page in a variable $s = Invoke-WebRequest -Uri https://theitbros.com -Verbose ## Filter links $s.Links | Where-Object { $_.href -ne "https://theitbros.com/" -and $_.href -notlike "*/privacy-policy/*" -and $_.href -notlike "*/category/*" -and $_.href -notlike "*/author/*" -and $_.href -notlike "*/about-the-authors/*" -and $_.href -notlike "*/contact-us/*" -and $_.outerHTML -like "<a href=`"https://theitbros.com*" } | Select-Object ` @{ n = 'Title'; e = { $(([regex]::Match($_.outerHTML, '>(.*?)<')).Groups[1].Value) } }, @{ n = 'URL'; e = { $_.href } }
El resultado se muestra a continuación.
Así es como puedes usar el Invocar-WebRequest cmdlet para realizar web scraping.
Ejemplo: ejecute una búsqueda en Google y extraiga el título y la URL
Usando el mismo enfoque que el ejemplo anterior, aquí hay un trabajo Invocar-WebRequest ejemplo sobre cómo realizar una búsqueda en Google y recuperar el título y la URL de los resultados.
Nota. Este ejemplo se probó solo en Windows PowerShell.
# Run a Google search $r = Invoke-WebRequest -Uri https://google.com/search ` -Body @{q = 'Recover Domain Controller' } $r.Links | Where-Object { $_.InnerHtml -match 'class=DnJfK' } | Select-Object ` @{n = 'Title'; e = { ($_.innerText).Split("`n")[0] } }, @{n = 'URL'; e = { ($_.href).Replace('/url?q=', '').Split('&')[0] } }
Resolución de URL acortadas
¿Está familiarizado con los acortadores de URL como TinyURL, Bitly y ShortURL? Su propósito es simple: acortar las URL.
Por ejemplo, estas URL cortas se resuelven en: https://theitbros.com/how-to-restore-domain-controller-from-backup/.
- https://tinyurl.com/yckmmarn
- https://bit.ly/3OpOZrB
- https://shorturl.at/JRU27
El Invocar-WebRequest puede ayudar a extraer la URL original a la que redirigen estas URL cortas.
Primero, ejecutemos la siguiente Invoke-WebRequest usando una de las URL abreviadas:
$shortUrl="[https://tinyurl.com/yckmmarn](https://tinyurl.com/yckmmarn)" $result = Invoke-WebRequest -Uri $Url -UseBasicParsing
En Windows PowerShell, puede extraer la URL original del BaseResponse.ResponseUri.AbsoluteUri propiedad.
En PowerShell Core, la URL original está en el BaseResponse.RequestMessage.RequestUri.AbsoluteUri propiedad.
Descargando archivos
El Invocar-WebRequest cmdlet también le permite descargar archivos y guardarlos en una ruta. Para ello, debe adjuntar el -OutFile
Por ejemplo, el siguiente comando descarga el archivo de ‘http://speedtest.ftp.otenet.gr/files/test100k.db’ al directorio actual.
$fileURL = 'http://speedtest.ftp.otenet.gr/files/test100k.db' Invoke-WebRequest -Uri $fileURL -OutFile $($fileURL).Split('/')[-1]
Si la fuente requiere autenticación, puede hacerlo usando los siguientes ejemplos.
Autenticación básica
Para realizar la autenticación básica, utilice el -Credencial parámetro y proporcionar el Credencial PSC objeto:
$credential = Get-Credential Invoke-WebRequest ` -Uri $fileURL ` -OutFile $($fileURL).Split('/')[-1] ` -Credential $credential
Autenticación de certificados
Para realizar la autenticación basada en certificados, puede utilizar el -CertificadoHuella digital parámetro y especifique la huella digital del certificado que desea usar. La huella digital debe ser válida y encontrarse en el almacén de certificados personales.
$CertificateThumbprint="0C251EA5C919AE134AA8494AA7FE15DE3A5E3635" Invoke-WebRequest ` -Uri $fileURL ` -OutFile $($fileURL).Split('/')[-1] ` -CertificateThumbprint $CertificateThumbprint
También puede utilizar el parámetro -Certificate, seguido del X509Certificado2 objeto:
$Certificate = Get-Item Cert:\CurrentUser\My\0C251EA5C919AE134AA8494AA7FE15DE3A5E3635 Invoke-WebRequest ` -Uri $fileURL ` -OutFile $($fileURL).Split('/')[-1] ` -Certificate $Certificate
Autenticación NTLM/Kerberos
Si el mecanismo de autenticación a usar es NTLM o Kerberos, puede agregar el -Usar credenciales predeterminadas cambiar en su lugar. Este conmutador utilizará las credenciales del usuario que ha iniciado sesión actualmente.
$fileURL = 'http://speedtest.ftp.otenet.gr/files/test100k.db' Invoke-WebRequest ` -Uri $fileURL ` -OutFile $($fileURL).Split('/')[-1] ` -UseDefaultCredentials
Conclusión
En conclusión, el Invocar-WebRequest El cmdlet de PowerShell es una poderosa herramienta que permite a los desarrolladores y administradores de sistemas enviar solicitudes HTTP y HTTPS mediante programación. Con su amplio conjunto de funciones y su sintaxis fácil de usar, simplifica el proceso de interacción con los recursos web, la recuperación de datos y la automatización de tareas basadas en la web.
Exploramos los conceptos fundamentales de hacer solicitudes HTTP y HTTPS usando Invoke-WebRequest, comenzando con la sintaxis y los parámetros básicos. Al examinar el objeto de respuesta, obtuvimos información sobre el estado, los encabezados y el contenido de la respuesta del servidor.
Al aprovechar el poder de Invocar-WebRequestlos desarrolladores y los administradores de sistemas pueden optimizar sus flujos de trabajo, mejorar la productividad y desbloquear un mundo de posibilidades en sus esfuerzos de creación de scripts de PowerShell.