Introducción
Contenido
- 1 Introducción
- 2 Prerrequisitos
- 3 Instalación
- 4 Ejemplos de código básico
- 4.0.1 Ejemplo 1: envío de una solicitud HTTP GET
- 4.0.2 Ejemplo 2: examen de los encabezados de respuesta GET
- 4.0.3 Ejemplo 3: envío de datos de formulario a través de HTTP POST
- 4.0.4 Ejemplo 4: Carga de archivos con POST de varias partes
- 4.0.5 Ejemplo 5: carga de un archivo con HTTP PUT
- 4.0.6 Ejemplo 6: envío de una solicitud HTTP DELETE
- 4.0.7 Ejemplo 7: escribir en un archivo
- 5 Conclusió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:
Te puede interesar:Implementación de una aplicación Flask en Heroku$ 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.
Te puede interesar:Comprender la palabra clave «rendimiento» de PythonLa 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.
Te puede interesar:Detección de objetos con ImageAI en PythonPara 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.
Te puede interesar:Python para la PNL: trabajar con la biblioteca FastText de FacebookSe 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 elfileupload
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
yFORM_BUFFERPTR
en lugar deFORM_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.
Te puede interesar:Leer y escribir YAML en un archivo en PythonSi 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.
Te puede interesar:Análisis de datos de la API con MongoDB, Seaborn y MatplotlibPor ú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.