Header Ads Widget

Ticker

6/recent/ticker-posts

Python Urllib

 Python urllib


Python tiene módulos incluidos en la biblioteca estándar que facilitan el trabajo con datos de Internet. El paquete urllib es uno de esos módulos. Este paquete se puede utilizar para obtener datos de Internet y realizar tareas de procesamiento comunes. Dentro de urllib está el módulo de solicitud. Este módulo es para leer URL en línea. Hay un módulo de errores disponible para tratar los errores que puedan surgir. El módulo de análisis facilita el análisis de las estructuras de URL. También hay un analizador de robots para trabajar con archivos robots.txt que puede encontrar en un servidor web. En este tutorial, veremos algunos de estos módulos en el paquete urllib.


Cómo recuperar datos

Para comenzar, primero podemos configurar un entorno virtual en Python con el virtualenv .comando en el directorio de nuestra elección. No olvide activar el entorno virtual con source ./Scripts/activateNuestro entorno virtual se llama vurllib (que significa urllib virtualizado), y nuestro indicador ahora es (vurllib) vurllib $, lo que indica que nuestro entorno está listo.

Ahora abramos el proyecto en Pycharm y agreguemos un nuevo archivo para probar algunos ejemplos de urllib.

ejemplos de Python urllib

Importando urllib

Antes de que podamos usar el software dentro del paquete urllib, necesitamos importarlo. Usemos la siguiente línea de código para importar la clase de solicitud del paquete urllib.

urllib_examples.py

Esto nos da acceso a los métodos de clase que probaremos en un momento. Pero primero, necesitamos algunas URL externas para trabajar.

httpbin al rescate

Httpbin es un servicio web increíble para probar bibliotecas HTTP. Tiene varios puntos finales excelentes que pueden probar prácticamente todo lo que necesita en una biblioteca HTTP. Compruébalo en https://httpbin.org

servicio de respuesta de solicitud httpbinorg

Establecer URL y recuperar datos

Ahora podemos especificar una URL con la que trabajar mientras la almacenamos en la urlvariable. Para hacer la solicitud a la URL, podemos usar la función urlopen () mientras pasamos la variable que contiene la URL. La respuesta ahora se almacena en la resultvariable.

Comprobación del código de respuesta Http

Los códigos de respuesta HTTP nos dicen si una solicitud HTTP específica se completó con éxito o no. Estas respuestas se agrupan en cinco clases diferentes.

  • Respuestas informativas (100-199)
  • Respuestas satisfactorias (200-299)
  • Redirecciones (300–399)
  • Errores del cliente (400–499)
  • Errores del servidor (500–599)

Cuando ejecutamos el código anterior, vemos un código de estado 200 OK, lo que significa que todo salió bien.

respuesta http 200 ok

Encabezados de respuesta Http

La respuesta de un servidor también incluye encabezados Http. Esta es información en forma de texto que un servidor web envía en respuesta a la recepción de una solicitud HTTP. El encabezado de respuesta contiene varios tipos de información y podemos inspeccionar esa información usando la getheaders()función.

Resultado

[('Fecha', 'Lun, 09 de marzo de 2020 16:05:38 GMT'), ('Content-Type', 'application / xml'),
 ('Contenido-Longitud', '522'), ('Conexión', 'cerrar'), ('Servidor', 'gunicorn / 19.9.0'),
 ('Access-Control-Allow-Origin', '*'), ('Access-Control-Allow-Credentials', 'true')]

Podemos ver la información del encabezado que el servidor envía arriba como resultado de llamar a la función getheaders () . Si desea un solo valor de encabezado, puede usar la función getheader () en su lugar. En la respuesta del encabezado hay una lista de valores de tuplaEntonces podemos ver que tenemos valores para Fecha, Tipo de contenido, Longitud de contenido, Conexión, Servidor, Control de acceso Permitir origen y Control de acceso Permitir credenciales. ¡Interesante!

Leer datos de respuesta

Ahora necesitamos leer los datos devueltos reales, o la carga útil, contenidos en la respuesta Http. Para hacerlo, podemos usar las funciones read () y decode () así.

Resultado

Datos devueltos: ---------------------
<? xml version = '1.0' encoding = 'us-ascii'?>

<! - UN MUESTRA de diapositivas ->

<presentación de diapositivas 
    title = "Muestra de diapositivas"
    date = "Fecha de publicación"
    author = "Sinceramente suyo"
    >

    <! - DIAPOSITIVA DEL TÍTULO ->
    <slide type = "all">
      <title> ¡Despierta con WonderWidgets! </title>
    </slide>

    <! - VISTA GENERAL ->
    <slide type = "all">
        <title> Descripción general </title>
        <item> Por qué <em> WonderWidgets </em> son geniales </item>
        <artículo />
        <item> Quién <em> compra </em> WonderWidgets </item>
    </slide>

</slideshow>

Podemos visitar la misma URL directamente en el navegador web para ver cómo procesa estos datos también.

servicio de prueba httpbin xml


OBTENER y PUBLICAR con urllib

En la sección anterior, vimos cómo usar urllib para obtener datos de un servicio web. Ahora queremos ver cómo enviar información a servidores web. Normalmente, esto se hará con una solicitud GET o POST Http. Una solicitud GET utiliza parámetros codificados directamente en la URL, que es una forma bastante común de enviar una consulta a un servicio web como una búsqueda de Bing. Si está intentando crear o actualizar algo en el servidor web, normalmente estará aprovechando una solicitud POST Http. Hay otros métodos Http para aprender como PUT, PATCH y DELETE, pero GET y POST serán suficientes la mayor parte del tiempo y esos dos serán los que probaremos aquí.

operación http y propósito

Solicitud para obtener un punto final

En el siguiente código, podemos comenzar configurando nuevamente una URL simple de http://httpbin.org/get. Luego leemos nuevamente el código de estado Http y leemos los datos devueltos usando read () y decode ().

Resultado

C: \ python \ vurllib \ Scripts \ python.exe C: /python/vurllib/urllib_examples.py
Código de resultado: 200
Datos devueltos: ----------------------
{
  "argumentos": {}, 
  "encabezados": {
    "Accept-Encoding": "identidad", 
    "Anfitrión": "httpbin.org", 
    "Agente de usuario": "Python-urllib / 3.8", 
    "X-Amzn-Trace-Id": "Raíz = 1-5e667d77-8282fd705e85709035d2c830"
  }, 
  "origen": "127.0.0.1", 
  "url": "http://httpbin.org/get"
}

Observe que la tecla args está vacía en la respuesta. Eso significa que no enviamos ningún dato junto con la solicitud. Sin embargo, podemos hacer eso, y esto es lo que haremos a continuación.

Crear una carga útil de args

Para pasar datos en la carga útil, podemos usar un diccionario de Python simple con algunos datos aleatorios, solo por ejemplo. Luego, los datos deben codificarse en URL primero con la función urlencode () . El resultado de esa operación se almacena en la datavariable. Finalmente, hacemos la solicitud con la función urlopen () pasando tanto la URL como los datos separados por un signo de interrogación.

Resultado

Mirando el resultado anterior, notamos dos cosas nuevas. La clave args no se completa con los datos de carga útil que nos interesan. Además, observe que la URL tiene todos los datos codificados en la propia URL. Así es como funciona una solicitud GET.

Realizar una solicitud POST

POST funciona de manera diferente a GET. El mismo diccionario de argumentos se puede seguir usando como carga útil, pero debe codificarse en bytes antes de realizar la solicitud POST. Esto se hace usando la función encode (). Esta es una de las funciones de cadena integradas que está disponible en Python y por defecto usa UTF-8. Para la solicitud POST, no agregamos los parámetros a la URL. En su lugar, puede utilizar el parámetro de datos de la función urlopen (). Al pasar los datos directamente a la función urlopen (), urllib cambiará automáticamente al uso del método POST detrás de escena. No es necesario decirle a urllib que use POST en lugar de GET.

Resultado

C: \ python \ vurllib \ Scripts \ python.exe C: /python/vurllib/urllib_examples.py
Código de resultado: 200
Datos devueltos: ----------------------
{
  "argumentos": {}, 
  "datos": "", 
  "archivos": {}, 
  "formulario": {
    "color azul", 
    "is_active": "Verdadero", 
    "forma": "Círculo"
  }, 
  "encabezados": {
    "Accept-Encoding": "identidad", 
    "Longitud del contenido": "38", 
    "Content-Type": "application / x-www-form-urlencoded", 
    "Anfitrión": "httpbin.org", 
    "Agente de usuario": "Python-urllib / 3.8", 
    "X-Amzn-Trace-Id": "Raíz = 1-5e6683a5-777d0378401b31982e213810"
  }, 
  "json": nulo, 
  "origen": "127.0.0.1", 
  "url": "http://httpbin.org/post"
}

¿Puedes encontrar las diferencias en la respuesta que obtenemos de httpbin? Así es, los datos de la carga útil ahora están dentro de la clave de formulario en lugar de argumentos. Además, tenga en cuenta que la clave de URL no tiene ningún dato incrustado en la propia URL. Entonces, podemos ver la distinción aquí entre GET y POST y cómo se diferencian con respecto al transporte de datos de carga útil.


Errores con urllib

Manejar errores no siempre es lo más divertido de hacer, pero es necesario. La web es inherentemente propensa a errores, por lo que los programas que realizan solicitudes Http deben estar preparados para esas situaciones. Es posible que tenga un problema en el que un código de error Http sea la respuesta de un servidor. O quizás la URL de la que intenta obtener datos ya no existe. Por otra parte, podría haber un problema de red que haga que la solicitud se agote. Varias cosas pueden ocasionar problemas al programa. Para mitigar estos escenarios, puede envolver solicitudes Http dentro de un bloque try-catch en Python. A continuación se muestran algunos ejemplos de cómo hacerlo.

Este primer ejemplo en realidad no tiene errores y funciona muy bien. Estamos usando urllib para buscar la URL de https://httpbin.org/html, que contiene texto de la novela de Moby Dick de Herman Melville. Podemos ver este resultado dentro de Pycharm.

Herman Melville - Moby-Dick

¿Qué pasa si realizamos este cambio en el código? Tenga en cuenta la línea 5 que ahora tiene una URL no válida.

Esta vez, el resultado es bastante diferente. Nuestro bloque except maneja el error con elegancia y muestra un error fácil de usar.

Pycharm manejar error de urllib

Httpbin también proporciona una forma de verificar los códigos de estado 404. Podemos probar esa condición de error de esta manera y notar que ahora obtenemos un error diferente.

intente excepto Python urllib

Algunas deficiencias de urllib

El módulo urllib es bastante fácil de usar, sin embargo, tiene algunos inconvenientes en comparación con otras bibliotecas. Una deficiencia de urllib es que solo admite un subconjunto del conjunto completo de verbos HTTP, como GET y POST. PUT, PATCH y DELETE no se usan con tanta frecuencia, pero sería bueno si la biblioteca Http que está utilizando pudiera implementarlos. Un segundo defecto es que urllib no decodifica automáticamente los datos devueltos por usted. Si está escribiendo una aplicación que tiene que lidiar con fuentes de datos desconocidas o con varias codificaciones, entonces es complicado trabajar con eso. No hay funciones integradas en urllib para trabajar con cookies, autenticación o sesiones. Trabajar con respuestas JSON es un poco difícil y los tiempos de espera son difíciles de manejar. Una alternativa a urllib que podemos probar son Python Requests.


Resumen de Python Urllib

En este tutorial, aprendimos un poco sobre cómo obtener datos de Internet en Python usando urllib, que es parte de la biblioteca estándar de Python. Para acceder a una URL con urllib, puede usar la función urlopen () que es parte de urllib.request. Los datos que se devuelven desde la solicitud al servidor deben transformarse mediante la función decode () . Para especificar una solicitud POST cuando usa la función urlopen () , todo lo que necesita hacer es incluir el parámetro de datos , y urllib cambia el verbo Http bajo el capó. También vimos algunos ejemplos de HTTPError y URLError y cómo procesarlos. A continuación, aprenderemos sobre la biblioteca de solicitudes de Python .

Publicar un comentario

0 Comentarios