Usando cURL en Python con PycURL

    Introducci贸n

    En este tutorial, aprenderemos a usar PycURL, que es una interfaz para la biblioteca cURL en Python. rizo es una herramienta utilizada para transferir datos hacia y desde un servidor y para realizar varios tipos de solicitudes de datos. PycURL es ideal para probar API REST, descargar archivos, etc. Algunos desarrolladores prefieren usar Postman para probar API, pero PycURL es otra opci贸n adecuada para hacerlo, ya que admite m煤ltiples protocolos como FILE, FTPS, HTTPS, IMAP, POP3, SMTP, SCP, SMB, etc. Adem谩s, PycURL es 煤til cuando muchos Se requieren conexiones simult谩neas, r谩pidas y confiables.

    Como se mencion贸 anteriormente, PycURL es una interfaz para la biblioteca libcURL en Python; por lo tanto, PycURL hereda todas las capacidades de libcURL. PycURL es extremadamente r谩pido (se sabe que es mucho m谩s r谩pido que Requests, que es una biblioteca de Python para solicitudes HTTP), tiene soporte multiprotocolo y tambi茅n contiene sockets para soportar operaciones de red.

    Prerrequisitos

    Antes de continuar con este tutorial, tenga en cuenta que existen algunos requisitos previos. Debe tener un conocimiento b谩sico de la sintaxis de Python y / o tener al menos experiencia en programaci贸n de nivel principiante en alg煤n otro lenguaje. Adem谩s, debe tener un buen conocimiento de los conceptos de redes comunes, como los protocolos y sus tipos, y el modo de comunicaci贸n cliente-servidor. La familiaridad con estos conceptos es esencial para comprender la biblioteca PycURL.

    Instalaci贸n

    El proceso de instalaci贸n de PycURL es bastante simple y directo para todos los sistemas operativos. Solo necesita tener libcURL instalado en su sistema para poder usar PycURL.

    SO Mac / Linux

    Para Mac OS y Linux, la instalaci贸n de PycURL es la m谩s simple, ya que no tiene dependencias y libcURL se instala por defecto. Simplemente ejecute el siguiente comando en su terminal y se completar谩 la instalaci贸n:

    Instalaci贸n v铆a pip
    $ pip install pycurl 
    
    Instalaci贸n mediante easy_install
    $ easy_install pycurl
    

    SO Windows

    Para Windows, sin embargo, hay algunas dependencias que deben instalarse antes de que PyCURL pueda usarse en sus programas. Si est谩 utilizando una distribuci贸n oficial de Python (es decir, ha descargado una versi贸n de Python del sitio web oficial https://www.python.org) as铆 como pip, simplemente necesita ejecutar el siguiente comando en su l铆nea de comando y la instalaci贸n estar谩 lista:

    $ pip install pycurl
    

    Si no est谩 utilizando pip, los instaladores de EXE y MSI est谩n disponibles en Windows PycURL. Puede descargarlos e instalarlos directamente desde all铆, como cualquier otra aplicaci贸n.

    Ejemplos de c贸digo b谩sico

    En esta secci贸n, cubriremos algunos ejemplos de codificaci贸n PycURL que demuestran las diferentes funcionalidades de la interfaz.

    Como se mencion贸 en la secci贸n de introducci贸n, PycURL admite muchos protocolos y tiene muchas caracter铆sticas sofisticadas. Sin embargo, en nuestros ejemplos, trabajaremos con el protocolo HTTP para probar las API REST utilizando los m茅todos HTTP m谩s utilizados: GET, POST, PUT y DELETE, junto con algunos otros ejemplos. Escribiremos la sintaxis para declararlos en Python 3, y tambi茅n explicaremos lo que hacen.

    隆As铆 que comencemos!

    Ejemplo 1: env铆o de una solicitud HTTP GET

    Una operaci贸n de red simple de PycURL es recuperar informaci贸n de un servidor dado usando su URL. Esto se denomina solicitud GET, ya que se usa para get un recurso de red.

    Se puede realizar una solicitud GET simple usando PycURL importando el m贸dulo BytesIO y creando su objeto. Se crea un objeto CURL para transferir datos y archivos a trav茅s de URL.

    La URL deseada se establece mediante el setopt() funci贸n, que se utiliza como setopt(option, value). los option par谩metro especifica qu茅 opci贸n establecer, p. ej. URL, WRITEDATA, etc., y el value par谩metro especifica el valor dado a esa opci贸n en particular.

    Los datos recuperados de la URL configurada se escriben luego en forma de bytes en el objeto BytesIO. A continuaci贸n, los bytes se leen del objeto BytesIO utilizando el getvalue() funci贸n y posteriormente se decodifican para imprimir el HTML en la consola.

    A continuaci贸n, se muestra un ejemplo de c贸mo hacer esto:

    import pycurl
    from io import BytesIO 
    
    b_obj = BytesIO() 
    crl = pycurl.Curl() 
    
    # Set URL value
    crl.setopt(crl.URL, 'https://wiki.python.org/moin/BeginnersGuide')
    
    # Write bytes that are utf-8 encoded
    crl.setopt(crl.WRITEDATA, b_obj)
    
    # Perform a file transfer 
    crl.perform() 
    
    # End curl session
    crl.close()
    
    # Get the content stored in the BytesIO object (in byte characters) 
    get_body = b_obj.getvalue()
    
    # Decode the bytes stored in get_body to HTML and print the result 
    print('Output of GET request:n%s' % get_body.decode('utf8')) 
    

    Salida:

    Output of GET request:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv = "Content-Type" content = "text/html; charset = utf-8">
    <meta name="robots" content="index,nofollow">
    
    <title>BeginnersGuide - Python Wiki</title>
    <script type="text/javascript" src = "/wiki/common/js/common.js" ></script>
    
    <script type = "text/javascript" >
    <!--
    var search_hint = "Search";
    //-->
    </script>
    .
    .
    .
    

    Ejemplo 2: examen de los encabezados de respuesta GET

    Tambi茅n puede recuperar los encabezados de respuesta de un sitio web con la ayuda de PycURL. Los encabezados de respuesta se pueden examinar por varias razones, por ejemplo, para averiguar qu茅 codificaci贸n se ha enviado con la respuesta y si es de acuerdo con la codificaci贸n proporcionada por el servidor.

    En nuestro ejemplo, examinaremos los encabezados de respuesta simplemente para descubrir varios nombres de atributos y sus valores correspondientes.

    Para examinar los encabezados de respuesta, primero necesitamos extraerlos, y lo hacemos usando el HEADERFUNCTION opci贸n y mostrarlos usando nuestra funci贸n autodefinida (display_header() en este caso).

    Proporcionamos la URL del sitio cuyos encabezados de respuesta deseamos examinar; HEADERFUNCTION env铆a los encabezados de respuesta al display_header() funci贸n donde est谩n formateados apropiadamente. Los encabezados de respuesta se decodifican de acuerdo con el est谩ndar especificado y se dividen en sus nombres y valores correspondientes. Los espacios en blanco entre los nombres y los valores se eliminan y luego se convierten a min煤sculas.

    Los encabezados de respuesta luego se escriben en el objeto BytesIO, se transfieren al solicitante y finalmente se muestran en el formato adecuado.

    from io import BytesIO
    import pycurl
    
    headers = {}
    
    def display_header(header_line):
        header_line = header_line.decode('iso-8859-1')
    
        # Ignore all lines without a colon
        if ':' not in header_line:
            return
    
        # Break the header line into header name and value
        h_name, h_value = header_line.split(':', 1)
    
        # Remove whitespace that may be present
        h_name = h_name.strip()
        h_value = h_value.strip()
        h_name = h_name.lower() # Convert header names to lowercase
        headers[h_name] = h_value # Header name and value.
    
    def main():
        print('**Using PycURL to get Twitter Headers**')
        b_obj = BytesIO()
        crl = pycurl.Curl()
        crl.setopt(crl.URL, 'https://twitter.com')
        crl.setopt(crl.HEADERFUNCTION, display_header)
        crl.setopt(crl.WRITEDATA, b_obj)
        crl.perform()
        print('Header values:-')
        print(headers)
        print('-' * 20)
        
    main()
    

    Salida:

    **Using PycURL to get Twitter Headers**
    Header values:-
    {'cache-control': 'no-cache, no-store, must-revalidate, pre-check=0, post-check=0', 'content-length': '303055', 'content-type': 'text/html;charset=utf-8', 'date': 'Wed, 23 Oct 2019 13:54:11 GMT', 'expires': 'Tue, 31 Mar 1981 05:00:00 GMT', 'last-modified': 'Wed, 23 Oct 2019 13:54:11 GMT', 'pragma': 'no-cache', 'server': 'tsa_a', 'set-cookie': 'ct0=ec07cd52736f70d5f481369c1d762d56; Max-Age=21600; Expires=Wed, 23 Oct 2019 19:54:11 GMT; Path=/; Domain=.twitter.com; Secure', 'status': '200 OK', 'strict-transport-security': 'max-age=631138519', 'x-connection-hash': 'ae7a9e8961269f00e5bde67a209e515f', 'x-content-type-options': 'nosniff', 'x-frame-options': 'DENY', 'x-response-time': '26', 'x-transaction': '00fc9f4a008dc512', 'x-twitter-response-tags': 'BouncerCompliant', 'x-ua-compatible': 'IE=edge,chrome=1', 'x-xss-protection': '0'}
    --------------------
    

    En los casos en que tengamos varios encabezados con el mismo nombre, solo se almacenar谩 el 煤ltimo valor del encabezado. Para almacenar todos los valores en encabezados de varios valores, podemos usar el siguiente c贸digo:

    if h_name in headers:
        if isinstance(headers[h_name], list):
            headers[name].append(h_value)
        else:
            headers[h_name] = [headers[h_name], h_value]
    else:
        headers[h_name] = h_value
    

    Ejemplo 3: env铆o de datos de formulario a trav茅s de HTTP POST

    Una solicitud POST es aquella que env铆a datos a un servidor web encerr谩ndolos en el cuerpo de la solicitud HTTP. Cuando carga un archivo o env铆a un formulario, b谩sicamente est谩 enviando una solicitud POST al servidor designado.

    Se puede realizar una solicitud POST usando PycURL configurando primero la URL para enviar los datos del formulario a trav茅s del setopt funci贸n. Los datos que se enviar谩n se almacenan primero en forma de diccionario (en pares clave-valor) y luego se codifican en URL utilizando el urlencode funci贸n encontrada en el urllib.parse m贸dulo.

    Usamos el POSTFIELDS opci贸n para enviar datos de formulario, ya que establece autom谩ticamente el m茅todo de solicitud HTTP en POST, y maneja nuestra pf datos tambi茅n.

    from urllib.parse import urlencode
    import pycurl
    
    crl = pycurl.Curl()
    crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
    data = {'field': 'value'}
    pf = urlencode(data)
    
    # Sets request method to POST,
    # Content-Type header to application/x-www-form-urlencoded
    # and data to send in request body.
    crl.setopt(crl.POSTFIELDS, pf)
    crl.perform()
    crl.close()
    

    Nota: Si desea especificar otro m茅todo de solicitud, puede utilizar el CUSTOMREQUEST opci贸n para hacerlo. Simplemente escriba el nombre del m茅todo de solicitud de su elecci贸n en las comillas vac铆as invertidas a continuaci贸n crl.CUSTOMREQUEST.

    crl.setopt(crl.CUSTOMREQUEST, '')
    

    Ejemplo 4: Carga de archivos con POST de varias partes

    Hay varias formas en las que puede replicar c贸mo se carga un archivo en un formulario HTML usando PycURL:

    • Si los datos que se enviar谩n a trav茅s de la solicitud POST est谩n en un archivo en su sistema, primero debe establecer la URL a la que desea enviar los datos. Luego especificas tu m茅todo de solicitud como HTTPPOST y usa el fileupload opci贸n para cargar el contenido del archivo deseado.
    import pycurl
    
    crl = pycurl.Curl()
    crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
    
    crl.setopt(crl.HTTPPOST, [
        ('fileupload', (
            # Upload the contents of the file
            crl.FORM_FILE, './my-resume.doc',
        )),
    ])
    crl.perform()
    crl.close()
    

    Nota: Si desea cambiar el nombre y / o el tipo de contenido del archivo, puede hacerlo haciendo ligeras modificaciones en el c贸digo anterior:

    crl.setopt(crl.HTTPPOST, [
        ('fileupload', (
            # Upload the contents of this file
            crl.FORM_FILE, './my-resume.doc',
            # Specify a file name of your choice
            crl.FORM_FILENAME, 'updated-resume.doc',
            # Specify a different content type of upload
            crl.FORM_CONTENTTYPE, 'application/msword',
        )),
    ])
    
    • Para los datos de archivo que tiene en la memoria, todo lo que var铆a en la implementaci贸n de la solicitud POST es la FORM_BUFFER y FORM_BUFFERPTR en lugar de FORM_FILE ya que estos obtienen los datos que se van a publicar, directamente desde la memoria.
    import pycurl
    
    crl = pycurl.Curl()
    crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
    
    crl.setopt(crl.HTTPPOST, [
        ('fileupload', (
            crl.FORM_BUFFER, 'contact-info.txt',
            crl.FORM_BUFFERPTR, 'You can reach me at [email聽protected]',
        )),
    ])
    
    crl.perform()
    crl.close()
    

    Ejemplo 5: carga de un archivo con HTTP PUT

    La solicitud PUT es de naturaleza similar a la solicitud POST, excepto por el hecho de que se puede usar para cargar un archivo en el cuerpo de la solicitud. Utiliza una solicitud PUT cuando conoce la URL del objeto que desea crear o sobrescribir. B谩sicamente, PUT reemplaza lo que exista actualmente en la URL de destino con algo m谩s.

    Si los datos que desea cargar se encuentran en un archivo f铆sico, primero debe establecer la URL de destino, luego cargar el archivo y abrirlo. Es importante que el archivo se mantenga abierto mientras el objeto cURL lo est谩 usando. Luego, los datos se leen del archivo usando READDATA.

    Finalmente, la transferencia de archivos (carga) se realiza utilizando el perform funci贸n y la sesi贸n cURL finaliza. Por 煤ltimo, se cierra el archivo que se abri贸 inicialmente para el objeto CURL.

    import pycurl
    
    crl = pycurl.Curl()
    crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
    
    dat_file = open('data.txt')
    
    crl.setopt(crl.UPLOAD, 1)
    crl.setopt(crl.READDATA, dat_file)
    
    crl.perform()
    crl.close()
    dat_file.close()
    

    Si los datos del archivo se encuentran en un b煤fer, la implementaci贸n de PycURL es pr谩cticamente la misma que la de cargar datos ubicados en un archivo f铆sico, con ligeras modificaciones. El objeto BytesIO codifica los datos utilizando el est谩ndar especificado. Esto es porque READDATA requiere un objeto similar a IO y los datos codificados son esenciales para Python 3. Los datos codificados se almacenan en un b煤fer y luego se lee. Se realiza la carga de datos y al finalizar la carga se finaliza la sesi贸n cURL.

    import pycurl
    crl = pycurl.Curl()
    crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
    
    data="{"person":{"name":"billy","email":"[email聽protected]"}}"
    buffer = BytesIO(data.encode('utf-8'))
    
    crl.setopt(crl.UPLOAD, 1)
    crl.setopt(crl.READDATA, buffer)
    
    crl.perform()
    crl.close()
    

    Ejemplo 6: env铆o de una solicitud HTTP DELETE

    Otro m茅todo HTTP importante y muy utilizado es DELETE. El m茅todo DELETE solicita que el servidor elimine el recurso identificado por la URL de destino. Se puede implementar usando el CUSTOMREQUEST funci贸n, como se puede ver en el ejemplo de c贸digo a continuaci贸n:

    import pycurl
    
    crl = pycurl.Curl()
    crl.setopt(crl.URL, "http://api.example.com/user/148951")
    crl.setopt(crl.CUSTOMREQUEST, "DELETE")
    crl.perform()
    crl.close()
    

    Ejemplo 7: escribir en un archivo

    PycURL tambi茅n se puede utilizar para guardar una respuesta en un archivo. Usamos el open funci贸n para abrir el archivo y la respuesta se devuelve como un objeto de archivo. los open la funci贸n es de la forma: open(file, mode). los file El par谩metro representa la ruta y el nombre del archivo que se abrir谩 y mode representa el modo en el que desea abrir el archivo. En nuestro ejemplo, es importante tener el archivo abierto en modo binario (es decir, wb) para evitar la codificaci贸n y decodificaci贸n de la respuesta.

    import pycurl
    
    file = open('pycurl.md','wb')
    
    crl = pycurl.Curl()
    crl.setopt(crl.URL, 'https://wiki.python.org/moin/BeginnersGuide')
    crl.setopt(crl.WRITEDATA, file)
    crl.perform()
    crl.close()
    

    Conclusi贸n

    En este tutorial, aprendimos sobre la interfaz PycURL en Python. Comenzamos hablando de algunas de las funciones generales de PycURL y su relevancia con la biblioteca libcURL en Python. Luego vimos el proceso de instalaci贸n de PycURL para diferentes sistemas operativos.

    Por 煤ltimo, revisamos algunos de los ejemplos generales de PycURL que demostraron las diversas funcionalidades que ofrece PycURL, como los m茅todos HTTP GET, POST, PUT y DELETE. Despu茅s de seguir este tutorial, deber铆a poder recuperar objetos identificados por una URL dentro de un programa Python con facilidad.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *