¿Qué es la biblioteca de solicitudes de Python?
La API de raspado universal sin desperdicio puede ser llamada desde la biblioteca de solicitudes de Python cuando un flujo de trabajo necesita adquisición gestionada o salida de página renderizada.
TL;DR
- requests es un cliente HTTP de terceros para Python. Envía métodos HTTP, codifica parámetros y cuerpos, maneja cookies y sesiones, y expone el estado de respuesta, encabezados, texto, bytes y JSON.
- requests no es un analizador HTML ni un navegador. Recupera respuestas del servidor pero no consulta un DOM ni ejecuta JavaScript del lado del cliente.
- Los tiempos de espera deben ser explícitos en cada llamada. Un trabajador de producción necesita una conexión conocida y un límite de lectura en lugar de una espera ilimitada.
- Las sesiones preservan cookies y reutilizan conexiones. Una sesión es útil para una secuencia relacionada de solicitudes y no debe compartirse entre identidades o tareas no relacionadas.
- La validación de respuestas necesita más que
raise_for_status. La página incorrecta puede llegar con un estado exitoso, así que verifica la URL final, el tipo de contenido y los marcadores de identidad.
requests es el cliente HTTP de alto nivel de Python
La biblioteca de solicitudes de Python proporciona una interfaz concisa para enviar solicitudes HTTP y leer respuestas. Soporta métodos comunes, parámetros de consulta, cuerpos de formularios y JSON, encabezados, cookies, autenticación, proxies, transmisión, verificación TLS, redirecciones y sesiones. Se instala por separado de la biblioteca estándar de Python.
El documento oficial de Requests describe la biblioteca como una interfaz HTTP y enumera funciones como agrupamiento de conexiones, persistencia de cookies, decodificación automática, soporte para proxies, descargas en streaming y tiempos de espera. Esas funciones resuelven preocupaciones de transporte; no analizan HTML específico de la aplicación.
Un modelo mental útil es solicitud entra, respuesta sale. Construyes la URL objetivo, método, encabezados y cuerpo. requests los envía y devuelve un Response. El código de aplicación luego decide si la respuesta es aceptable y si debe analizar texto, bytes o JSON.
Qué contiene un objeto de respuesta
Una respuesta expone status_code, encabezados, la final url, historial de redirecciones, decodificado text, crudo content bytes, y un json() ayudante. El inicio rápido de Requests también recomienda raise_for_status() cuándo un estado HTTP fallido debe convertirse en una excepción.
| Propiedad de respuesta | Significado | Precaución común |
|---|---|---|
status_code | Estado de respuesta HTTP | El éxito no prueba la identidad de la página |
headers | Metadatos de respuesta | El tipo de contenido declarado aún puede ser incorrecto |
text | Texto de respuesta decodificado | La elección de codificación afecta a los caracteres |
content | Bytes de respuesta sin procesar | Cuerpos grandes requieren transmisión o límites |
json() | Decodificar un cuerpo JSON | JSON válido puede acompañar un estado de error |
url | URL de respuesta final | Las redirecciones pueden llevar a una página no deseada |
Llamar json() prueba solo que el cuerpo puede ser decodificado como JSON. No hace que una respuesta fallida sea exitosa. Verifica el estado y el esquema de respuesta esperado antes de aceptar valores.
Enviar una solicitud limitada
El espacio de trabajo actual contiene solicitudes, por lo que este patrón se puede importar y ejecutar. El ejemplo muestra tiempos de espera explícitos, verificación de estado, inspección del tipo de contenido y un marcador de identidad de página antes de que cualquier analizador reciba el cuerpo.
import requests
with requests.Session() as session:
session.headers.update({
"Accept": "text/html,application/xhtml+xml",
"User-Agent": "ExampleResearchClient/1.0",
})
response = session.get(
"https://example.com/",
timeout=(10, 20),
allow_redirects=True,
)
response.raise_for_status()
content_type = response.headers.get("content-type", "")
if "text/html" not in content_type.lower():
raise ValueError("expected an HTML response")
if "Example Domain" not in response.text:
raise ValueError("expected page identity is missing")
print({
"final_url": response.url,
"status": response.status_code,
"characters": len(response.text),
})
La tupla de tiempo de espera separa el tiempo de conexión del tiempo máximo de espera entre bytes recibidos. Asigne a cada llamada un valor explícito relacionado con la carga de trabajo. Un programador no puede gestionar la capacidad cuando una solicitud puede esperar indefinidamente.
Utilice sesiones para solicitudes relacionadas
A Session persiste cookies y configuración predeterminada entre solicitudes y utiliza agrupación de conexiones a través de sus adaptadores. Es una buena opción para una secuencia que comparte un estado, idioma y host permitidos. Debe cerrarse cuando esa tarea lógica termine.
No comparta una sesión autenticada o personalizada entre trabajos no relacionados. Las cookies afectan lo que el servidor devuelve y pueden mover la colección fuera del ámbito público previsto. Mantenga secretos en almacenamiento de variables de entorno o credenciales, no en código, URLs, registros o registros serializados.
Los valores predeterminados de la sesión pueden incluir encabezados, autenticación, proxies y parámetros de consulta. Los valores por solicitud los anulan donde se documentan. Mantenga el conjunto predeterminado pequeño para que el comportamiento de una solicitud siga siendo obvio durante la revisión.
Comprenda el límite con el análisis
requests no proporciona selectores CSS ni XPath. Combínelo con BeautifulSoup, lxml, parsel u otro analizador cuando la respuesta sea HTML. Para JSON, valide el objeto devuelto directamente contra las claves y tipos esperados.
requests tampoco ejecuta scripts de páginas. Un navegador puede mostrar contenido que está ausente de. response.textCompare la respuesta en bruto con el DOM en vivo, inspeccione las fuentes de red permitidas y use la adquisición renderizada cuando los datos requeridos existen solo después de que se ejecute JavaScript.
- Verifique el estado antes de decodificar los datos de la aplicación. Los cuerpos de error pueden ser HTML o JSON válidos.
- Verifique la URL final. Una redirección automática puede aterrizar en una página de cuenta genérica o de consentimiento.
- Valide el tipo de contenido y la identidad. Un encabezado o clave de esquema conocido confirma la clase de respuesta.
- Limite el tamaño de la respuesta. Transmita descargas grandes y deténgase cuando el cuerpo exceda el contrato de página aceptado.
Configure proxies sin filtrar credenciales
requests acepta URLs de proxy a través del proxies argumento y puede leer la configuración de entorno estándar. Trate las credenciales de proxy como claves de API: manténgalas fuera del código fuente, evite que aparezcan en el texto de excepciones y no almacene URLs totalmente acreditadas en la salida.
El uso de proxy debe coincidir con un propósito geográfico y de acceso permitido. Una ubicación de salida diferente puede cambiar el idioma, el precio, el inventario, los requisitos de consentimiento y las obligaciones legales. Registre la región prevista como metadatos por lotes para que las comparaciones posteriores no mezclen páginas diferentes.
Elija la codificación del cuerpo según el contrato del servidor
Utilice params para valores de cadena de consulta, data para contenido de cuerpo de formulario o en bruto, json para un documento JSON y files para cargas multipartes. Estos argumentos no son intercambiables incluso cuando Python acepta el mismo diccionario. El servidor interpreta el cuerpo a través de su tipo de contenido y contrato de punto final.
La autenticación pertenece a un objeto de autenticación admitido, configuración de sesión o encabezado explícito definido por el servicio. Mantenga las credenciales fuera de las cadenas de consulta porque las URLs aparecen en historiales, registros de acceso, análisis y mensajes de error. Elimine los encabezados de autorización antes de registrar una solicitud preparada.
Para una API de adquisición de datos, valide ambas capas de éxito: la respuesta HTTP y el sobre o esquema de la API. Un estado HTTP exitoso puede llevar un error a nivel de aplicación, mientras que un decodificador JSON puede analizar cualquiera de los dos. Los campos requeridos y los tipos de valores esperados deben comprobarse antes de que el resultado llegue a un analizador HTML.
Transmita cuerpos grandes y cierre recursos
Para una respuesta grande, establezca stream=True, inspeccione encabezados y itere sobre fragmentos limitados. La respuesta debe cerrarse explícitamente o usarse en un administrador de contexto. La transmisión controla la memoria local, pero la aplicación aún necesita un tamaño máximo de cuerpo aceptado y una comprobación de tipo de contenido.
Los analizadores HTML a menudo construyen un árbol completo, por lo que transmitir la descarga no convierte automáticamente el análisis en memoria constante. Elija un analizador de streaming o un formato dividido solo cuando la fuente lo admita. Mantenga el límite de adquisición alineado con el analizador y la clase de documento esperada.
Valide los contratos HTTP y de datos
La especificación de semántica HTTP define métodos, códigos de estado y comportamiento de respuesta. La corrección de la aplicación se sitúa por encima de esa capa. Una respuesta exitosa aún debe coincidir con el host previsto, la ruta final, el tipo de contenido, la identidad de la página y el esquema de datos.
Para flujos de trabajo de la web pública, defina el alcance autorizado antes de enviar solicitudes. Revise los términos y la ley aplicable, respete los controles de acceso y utilice el Protocolo de Exclusión de Robots como una entrada legible por máquina para la política de arañitas.
Conclusión
La biblioteca requests de Python es la capa de transporte para muchos flujos de trabajo de datos. Hace que HTTP sea conciso, proporciona sesiones y reutilización de conexiones, expone metadatos de respuesta y admite transmisión y proxies. No analiza HTML ni ejecuta JavaScript. El uso confiable agrega tiempos de espera explícitos, verificaciones de URL final e identidad, cuerpos limitados, un ámbito de sesión cuidadoso y una capa de analizador o adquisición renderizada separada cuando es necesario.
¿Listo para usar requests con adquisición web gestionada?
Llame a Scrapeless desde un cliente HTTP de Python familiar, valide el contenido devuelto y páselo al analizador y esquema que su aplicación ya utiliza.
Regístrate hoy y obtén $5 en crédito gratis — sin tarjeta de crédito requerida.
Reclama tu crédito de $5 →Preguntas Frecuentes
¿Es requests parte de la biblioteca estándar de Python?
No. requests es un paquete de terceros instalado por separado. La biblioteca estándar de Python incluye módulos de HTTP y URL de menor nivel, mientras que requests proporciona una interfaz de mayor nivel.
¿Cuál es la diferencia entre requests y BeautifulSoup?
requests obtiene una respuesta HTTP, mientras que BeautifulSoup analiza HTML o XML. Un flujo de trabajo común para páginas estáticas utiliza requests primero y BeautifulSoup después.
¿Puede Python requests ejecutar JavaScript?
No. requests recupera la respuesta del servidor y no ejecuta un navegador. Usa adquisición renderizada cuando los scripts crean el contenido de la página requerido.
¿Por qué debería cada llamada a requests establecer un tiempo de espera?
Un tiempo de espera explícito le da a un trabajador un límite de red conocido y protege la capacidad de la cola. Sin uno, una solicitud puede esperar mucho más de lo que la aplicación espera.
¿Cuándo se debe utilizar una sesión de requests?
Utiliza una sesión para solicitudes relacionadas que comparten cookies, encabezados, autenticación o un grupo de conexiones. Manténlo limitado a una identidad lógica y ciérralo después.