Usando el módulo de solicitudes en Python

Solicitudes es un módulo de Python que puede usar para enviar todo tipo de solicitudes HTTP. Es una biblioteca fácil de usar con muchas características que van desde pasar parámetros en las direcciones URL hasta enviar encabezados personalizados y verificación SSL. En este tutorial, aprenderá cómo usar esta biblioteca para enviar solicitudes HTTP simples en Python.

Puede usar las solicitudes con Python versión 2.6-2.7 y 3.3-3.6. Antes de continuar, debe saber que Requests es un módulo externo, por lo que deberá instalarlo antes de probar los ejemplos de este tutorial. Puede instalarlo ejecutando el siguiente comando en el terminal:

solicitudes de instalación de pip

Una vez que haya instalado el módulo, puede verificar si se ha instalado correctamente importándolo con este comando:

solicitudes de importación

Si la instalación se realizó correctamente, no verá ningún mensaje de error..

Hacer una solicitud GET

Es muy fácil enviar una solicitud HTTP utilizando Solicitudes. Usted comienza importando el módulo y luego realiza la solicitud. Aquí hay un ejemplo:

las solicitudes de importación req = requests.get ('https://tutsplus.com/')

Toda la información sobre nuestra solicitud ahora se almacena en un objeto de Respuesta llamado req. Por ejemplo, puede obtener la codificación de la página web utilizando el req.codificación propiedad. También puede obtener el código de estado de la solicitud utilizando el req.status_code propiedad.

req.encoding # devuelve 'utf-8' req.status_code # devuelve 200

Puede acceder a las cookies que el servidor le devolvió utilizando req.cookies. Del mismo modo, puede obtener los encabezados de respuesta utilizando req.headers. los req.headers La propiedad devuelve un diccionario insensible de mayúsculas y minúsculas de cabeceras de respuesta Esto significa que req.headers ['Content-Length']req.headers ['content-length']req.headers ['CONTENT-LENGTH'] todos devolverán el valor de la 'Largancia de contenido' encabezado de respuesta.

Puede verificar si la respuesta es un redireccionamiento HTTP bien formado que podría haberse procesado automáticamente usando la req.is_redirect propiedad. Volverá Cierto o Falso Basado en la respuesta. También puede obtener el tiempo transcurrido entre el envío de la solicitud y la respuesta mediante el comando req.elapsed propiedad.

La URL que inicialmente pasaste a la obtener() La función puede ser diferente de la URL final de la respuesta por una variedad de razones, incluidas las redirecciones. Para ver la URL de respuesta final, puede utilizar la req.url propiedad.

solicitudes de importación req = requests.get ('http://www.tutsplus.com/') req.encoding # devuelve 'utf-8' req.status_code # devuelve 200 req.elapsed # devuelve datetime.timedelta (0, 1, 666890) req.url # devuelve 'https://tutsplus.com/' req.history # devuelve [, ] req.headers ['Content-Type'] # devuelve 'text / html; conjunto de caracteres = utf-8 ' 

Es bueno obtener toda esta información sobre la página web a la que está accediendo, pero lo más probable es que desee acceder al contenido real. Si el contenido al que está accediendo es texto, puede utilizar el req.text Propiedad para acceder a ella. El contenido se analiza como Unicode. Puede pasar la codificación con la que decodificar el texto usando la req.codificación propiedad.

En el caso de respuestas que no sean de texto, puede acceder a ellas en formato binario utilizando req.content. El módulo se decodificará automáticamente. gzip y desinflar codificaciones de transferencia. Esto puede ser útil cuando se trata de archivos multimedia. Del mismo modo, puede acceder al contenido codificado en json de la respuesta, si existe, utilizando req.json ().

También puede obtener la respuesta sin procesar del servidor usando req.raw. Ten en cuenta que tendrás que pasar. stream = True en la solicitud para obtener la respuesta en bruto.

Algunos archivos que descarga de Internet mediante el módulo Solicitudes pueden tener un tamaño enorme. En tales casos, no será prudente cargar toda la respuesta o el archivo en la memoria a la vez. Puede descargar un archivo en trozos o trozos usando el iter_content (chunk_size = 1, decode_unicode = False) método. 

Este método itera sobre los datos de respuesta en tamaño de porción Número de bytes a la vez. Cuando stream = True se estableció en la solicitud, este método evitará leer todo el archivo en la memoria de una vez para obtener respuestas grandes. los tamaño de porción parámetro puede ser un número entero o Ninguna. Cuando se establece en un valor entero, tamaño de porción Determina el número de bytes que se deben leer en la memoria.

Cuando tamaño de porción se establece en Ninguna y corriente se establece en Cierto, Los datos se leerán a medida que se reciban en cualquier tamaño de trozos recibidos. Cuando tamaño de porción se establece en Ninguna y corriente se establece en Falso, Todos los datos serán devueltos como un solo fragmento..

Descarguemos esta imagen de un bosque en Pixabay usando el módulo Solicitudes. Aquí está la imagen real:

Este es el código que necesitas:

las solicitudes de importación req = requests.get ('path / to / forest.jpg', stream = True) req.raise_for_status () con open ('Forest.jpg', 'wb') como fd: for chunk in req.iter_content ( chunk_size = 50000): print ('Received a Chunk') fd.write (chunk)

los 'path / to / forest.jpg' es la URL real de la imagen; Puedes poner la URL de cualquier otra imagen aquí para descargar algo más. El archivo de imagen dado tiene un tamaño de 185 kb, y ha configurado tamaño de porción a 50.000 bytes. Esto significa que el mensaje "Received a Chunk" debe imprimirse cuatro veces en el terminal. El tamaño del último fragmento solo será de 39350 bytes porque la parte del archivo que queda por recibir después de las tres primeras iteraciones es de 39350 bytes.

Las solicitudes también le permiten pasar parámetros en una URL. Esto puede ser útil cuando busca en una página web algunos resultados, como una imagen específica o un tutorial. Puede proporcionar estas cadenas de consulta como un diccionario de cadenas utilizando el params palabra clave en la solicitud GET. Aquí hay un ejemplo:

consulta de solicitudes de importación = 'q': 'Bosque', 'orden': 'popular', 'min_width': '800', 'min_height': '600' req = requests.get ('https: // pixabay. com / en / photos / ', params = query) req.url # devuelve' https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800 '

Hacer una solicitud POST

Hacer una solicitud POST es tan fácil como hacer solicitudes GET. Solo usas el enviar() función en lugar de obtener(). Esto puede ser útil cuando está enviando formularios automáticamente. Por ejemplo, el siguiente código descargará toda la página de Wikipedia sobre nanotecnología y la guardará en su PC.

las solicitudes de importación req = requests.post ('https://en.wikipedia.org/w/index.php', data = 'search': 'Nanotechnology') req.raise_for_status () with open ('Nanotechnology.html ',' wb ') como fd: para el fragmento en req.iter_content (chunk_size = 50000): fd.write (chunk)

Envío de cookies y encabezados

Como se mencionó anteriormente, puede acceder a las cookies y los encabezados que el servidor le envía de vuelta usando req.cookies y req.headers. Las solicitudes también le permiten enviar sus propias cookies y encabezados personalizados con una solicitud. Esto puede ser útil cuando quiere, digamos, establecer un agente de usuario personalizado para su solicitud.

Para agregar encabezados HTTP a una solicitud, simplemente puede pasarlos a un dictado al encabezados parámetro. Del mismo modo, también puede enviar sus propias cookies a un servidor utilizando un dictado pasado a la galletas parámetro.

url = 'http://some-domain.com/set/cookies/headers' headers = 'user-agent': 'su-own-user-agent / 0.0.1' cookies = 'visit- month ':' February ' req = requests.get (url, headers = headers, cookies = cookies) 

Las cookies también se pueden pasar en un tarro de cookies. Proporcionan una interfaz más completa que le permite usar esas cookies en múltiples rutas. Aquí hay un ejemplo:

importar solicitudes jar = requests.cookies.RequestsCookieJar () jar.set ('first_cookie', 'first', domain = "httpbin.org", path = "/ cookies") jar.set ('second_cookie', 'second', domain = "httpbin.org", path = "/ extra") jar.set ('third_cookie', 'third', domain = "httpbin.org", path = "/ cookies") url = 'http: // httpbin .org / cookies 'req = requests.get (url, cookies = jar) req.text # devuelve' "cookies": "first_cookie": "first", "third_cookie": "third" '

Objetos de sesión

A veces es útil conservar ciertos parámetros en múltiples solicitudes. El objeto Session hace exactamente eso. Por ejemplo, persistirán los datos de las cookies en todas las solicitudes realizadas con la misma sesión. El objeto Session utiliza la agrupación de conexiones de urllib3. Esto significa que la conexión TCP subyacente se reutilizará para todas las solicitudes realizadas al mismo host. Esto puede aumentar significativamente el rendimiento. También puede utilizar métodos del objeto Solicitudes con el objeto Sesión..

Aquí hay un ejemplo de múltiples solicitudes enviadas con y sin usar sesiones:

solicitudes de importación reqOne = requests.get ('https://tutsplus.com/') reqOne.cookies ['_ tuts_session'] #returns 'cc118d94a84f0ea37c64f14dd868a175' reqTwo = requests.get ('https://code.tutsplus.com/tutorials ') reqTwo.cookies [' _ tuts_session '] #returns' 3775e1f1d7f3448e25881dfc35b8a69a 'ssnOne = request. reqThree = ssnOne.get ('https://code.tutsplus.com/tutorials') reqThree.cookies ['_ tuts_session'] #returns '4c3dd2f41d2362108fbb191448eab3b4' 

Como puede ver, la cookie de sesión tiene un valor diferente en la primera y la segunda solicitud, pero tiene el mismo valor cuando usamos el objeto Session. Obtendrá un valor diferente cuando pruebe este código, pero también en su caso, la cookie para las solicitudes realizadas utilizando el objeto de sesión tendrá el mismo valor.

Las sesiones también son útiles cuando desea enviar los mismos datos en todas las solicitudes. Por ejemplo, si decide enviar una cookie o un encabezado de agente de usuario con todas las solicitudes a un dominio determinado, puede usar objetos de sesión. Aquí hay un ejemplo:

solicitudes de importación ssn = requests.Session () ssn.cookies.update ('visit-month': 'February') reqOne = ssn.get ('http://httpbin.org/cookies') imprimir (reqOne.text ) # imprime información sobre la cookie "visit-month" reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'visit-year': '2017') print (reqTwo.text) # imprime información sobre la cookie "visita-mes" y "visita-año" reqThree = ssn.get ('http://httpbin.org/cookies') imprime (reqThree.text) # imprime información sobre la cookie "visita-mes" 

Como puedes ver, la "mes de visita" La cookie de sesión se envía con las tres solicitudes. sin embargo, el "visita-año" La cookie se envía solo durante la segunda solicitud. No hay mención de la "año de visita" cookie en la tercera solicitud también. Esto confirma el hecho de que las cookies u otros conjuntos de datos en solicitudes individuales no se enviarán con otras solicitudes de sesión.

Conclusión

Los conceptos descritos en este tutorial deberían ayudarlo a realizar solicitudes básicas a un servidor al pasar encabezados específicos, cookies o cadenas de consulta. Esto será muy útil cuando esté intentando raspar algunas páginas web para obtener información. Ahora, también debería poder descargar automáticamente archivos de música y fondos de pantalla de diferentes sitios web una vez que haya descubierto un patrón en las URL.

No dude en ver lo que tenemos disponible para la venta y para estudiar en el mercado, y no dude en hacer cualquier pregunta y proporcionar sus valiosos comentarios utilizando el siguiente feed..

Si tiene alguna pregunta sobre este tutorial, hágamelo saber en los comentarios..

Aprender Python

Aprende Python con nuestra completa guía de tutoriales de Python, ya sea que estés empezando o seas un programador experimentado que busca aprender nuevas habilidades..