Utilisation du module Requests en Python

Requests est un module Python que vous pouvez utiliser pour envoyer toutes sortes de requêtes HTTP. C'est une bibliothèque facile à utiliser avec de nombreuses fonctionnalités allant du passage de paramètres dans les URL à l'envoi d'en-têtes personnalisés et à la vérification SSL. Dans ce tutoriel, vous allez apprendre à utiliser cette bibliothèque pour envoyer des requêtes HTTP simples en Python..

Vous pouvez utiliser Requests avec les versions 2.6-2.7 et 3.3-3.6 de Python. Avant de poursuivre, vous devez savoir que Requests est un module externe. Vous devez donc d'abord l'installer avant d'essayer les exemples de ce didacticiel. Vous pouvez l'installer en exécutant la commande suivante dans le terminal:

demandes d'installation de pip

Une fois le module installé, vous pouvez vérifier s'il a été correctement installé en l'important à l'aide de cette commande:

demandes d'importation

Si l'installation a réussi, vous ne verrez aucun message d'erreur.

Faire une demande GET

Il est très facile d'envoyer une requête HTTP à l'aide de Requests. Vous commencez par importer le module, puis effectuez la demande. Voici un exemple:

demandes d'importation req = requests.get ('https://tutsplus.com/')

Toutes les informations sur notre demande sont maintenant stockées dans un objet Response appelé req. Par exemple, vous pouvez obtenir le codage de la page Web en utilisant le req.encodage propriété. Vous pouvez également obtenir le code d’état de la demande à l’aide du bouton req.status_code propriété.

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

Vous pouvez accéder aux cookies que le serveur a renvoyés en utilisant req.cookies. De même, vous pouvez obtenir les en-têtes de réponse en utilisant req.headers. le req.headers property renvoie un dictionnaire des en-têtes de réponse sans tenir compte de la casse. Cela signifie que req.headers ['Content-Length']req.headers ['content-length'] et req.headers ['CONTENU-LENGTH'] retournera tous la valeur de la 'Longueur du contenu' en-tête de réponse.

Vous pouvez vérifier si la réponse est une redirection HTTP bien formée qui aurait pu être traitée automatiquement à l'aide de la commande req.is_redirect propriété. Il reviendra Vrai ou Faux basé sur la réponse. Vous pouvez également obtenir le temps écoulé entre l’envoi de la demande et le renvoi d’une réponse à l’aide de la touche req.elapsed propriété.

L'URL que vous avez initialement transmise au obtenir() La fonction peut être différente de l'URL finale de la réponse pour diverses raisons, notamment les redirections. Pour voir l'URL de la réponse finale, vous pouvez utiliser le req.url propriété.

demandes d'importation req = requests.get ('http://www.tutsplus.com/') req.encoding # renvoie 'utf-8' req.status_code # renvoie 200 req.elapsed # renvoie datetime.timedelta (0, 1, 666890) req.url # renvoie 'https://tutsplus.com/' req.history # renvoie [, ] req.headers ['Content-Type'] # renvoie 'text / html; jeu de caractères = utf-8 ' 

Obtenir toutes ces informations sur la page Web à laquelle vous accédez est agréable, mais vous voudrez probablement accéder au contenu réel. Si le contenu auquel vous accédez est du texte, vous pouvez utiliser le req.text propriété d'y accéder. Le contenu est ensuite analysé au format Unicode. Vous pouvez transmettre le codage avec lequel décoder le texte à l’aide du bouton req.encodage propriété.

Dans le cas de réponses non textuelles, vous pouvez y accéder sous forme binaire en utilisant req.content. Le module se décodera automatiquement gzip et dégonfler transferts de codage. Cela peut être utile lorsque vous traitez avec des fichiers multimédias. De même, vous pouvez accéder au contenu codé en json de la réponse, s’il existe, en utilisant req.json ().

Vous pouvez également obtenir la réponse brute du serveur en utilisant req.raw. Gardez à l'esprit que vous devrez passer stream = True dans la demande pour obtenir la réponse brute.

Certains fichiers téléchargés sur Internet à l'aide du module Requests peuvent avoir une taille énorme. Dans ce cas, il ne sera pas judicieux de charger la totalité de la réponse ou du fichier en même temps dans la mémoire. Vous pouvez télécharger un fichier par morceaux ou par morceaux à l’aide de la touche iter_content (chunk_size = 1, decode_unicode = False) méthode. 

Cette méthode itère sur les données de réponse dans taille de chunk nombre d'octets à la fois. Quand stream = True a été défini sur la demande, cette méthode évitera de lire le fichier entier en mémoire en une fois pour les réponses volumineuses. le taille de chunk paramètre peut être soit un entier ou Aucun. Lorsque défini sur une valeur entière, taille de chunk détermine le nombre d'octets qui doivent être lus dans la mémoire.

Quand taille de chunk est réglé sur Aucun et courant est réglé sur Vrai, les données seront lues au fur et à mesure de leur arrivée, quelle que soit la taille des morceaux reçus. Quand taille de chunk est réglé sur Aucun et courant est réglé sur Faux, toutes les données seront retournées sous forme d'un seul morceau.

Téléchargeons cette image d'une forêt sur Pixabay à l'aide du module Requêtes. Voici l'image réelle:

C'est le code dont vous avez besoin:

demandes d'importation req = requests.get ('chemin / vers / forest.jpg', stream = True) req.raise_for_status () avec open ('Forest.jpg', 'wb') comme fd: for chunk dans req.iter_content ( chunk_size = 50000): print ('Reçu un morceau') fd.write (morceau)

le 'path / to / forest.jpg' est l'URL de l'image réelle; vous pouvez mettre l'URL de n'importe quelle autre image ici pour télécharger autre chose. Le fichier image donné est de 185 Ko, et vous avez défini taille de chunk à 50 000 octets. Cela signifie que le message "Received a Chunk" doit être imprimé quatre fois dans le terminal. La taille du dernier bloc sera simplement de 39350 octets, car la partie du fichier restant à recevoir après les trois premières itérations est de 39350 octets..

Requests vous permet également de passer des paramètres dans une URL. Cela peut être utile lorsque vous recherchez une page Web pour obtenir des résultats tels qu'une image ou un didacticiel spécifique. Vous pouvez fournir ces chaînes de requête sous forme de dictionnaire de chaînes à l'aide du params mot clé dans la requête GET. Voici un exemple:

requêtes d'importation requête = 'q': 'Forêt', 'ordre': 'populaire', 'min_width': '800', 'min_height': '600' req = requests.get ('https: // pixabay. com / fr / photos / ', params = query) req.url # renvoie' https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800 '

Faire une demande POST

Faire une demande POST est aussi simple que faire une demande GET. Vous venez d'utiliser le poster() fonction au lieu de obtenir(). Cela peut être utile lorsque vous soumettez automatiquement des formulaires. Par exemple, le code suivant téléchargera toute la page Wikipedia sur la nanotechnologie et l'enregistrera sur votre PC..

demandes d'importation req = requests.post ('https://en.wikipedia.org/w/index.php', data = 'search': 'Nanotechnology') req.raise_for_status () avec open ('Nanotechnology.html ',' wb ') en tant que fd: pour un bloc dans req.iter_content (chunk_size = 50000): fd.write (chunk)

Envoi de cookies et en-têtes

Comme mentionné précédemment, vous pouvez accéder aux cookies et aux en-têtes que le serveur vous renvoie en utilisant req.cookies et req.headers. Requests vous permet également d'envoyer vos propres cookies et en-têtes personnalisés avec une requête. Cela peut être utile lorsque vous voulez, par exemple, définir un agent d'utilisateur personnalisé pour votre demande..

Pour ajouter des en-têtes HTTP à une demande, vous pouvez simplement les transmettre dans un fichier. dict au en-têtes paramètre. De même, vous pouvez également envoyer vos propres cookies à un serveur à l'aide d'un dict passé au biscuits paramètre.

demandes d'importation url = 'http://some-domain.com/set/cookies/headers' headers = 'user-agent': 'your-own-user-agent / 0.0.1' cookies = 'visit- mois ':' février ' req = requests.get (url, en-têtes = en-têtes, cookies = cookies) 

Les cookies peuvent également être passés dans un cookie jar. Ils fournissent une interface plus complète pour vous permettre d’utiliser ces cookies sur plusieurs chemins. Voici un exemple:

demandes d'importation jar = demandes.cookies.RequestsCookieJar () jar.set ('first_cookie', 'premier', domaine = "httpbin.org", chemin = "/ cookies") jar.set ('second_cookie', 'second', domain = "httpbin.org", chemin = "/ extra") jar.set ('third_cookie', 'third', domaine = "httpbin.org", chemin = "/ cookies") url = 'http: // httpbin .org / cookies 'req = requests.get (URL, cookies = jar) req.text # renvoie' "cookies": "first_cookie": "premier", "third_cookie": "tiers" '

Objets de session

Parfois, il est utile de conserver certains paramètres dans plusieurs requêtes. L'objet Session fait exactement cela. Par exemple, il conservera les données de cookie dans toutes les demandes effectuées à l'aide de la même session. L'objet Session utilise le pooling de connexions de urllib3. Cela signifie que la connexion TCP sous-jacente sera réutilisée pour toutes les demandes adressées au même hôte. Cela peut considérablement améliorer les performances. Vous pouvez également utiliser les méthodes de l'objet Requests avec l'objet Session..

Voici un exemple de demandes multiples envoyées avec et sans sessions:

demandes d'importation reqOne = requests.get ('https://tutsplus.com/') reqOne.cookies ['_ _ tuts_session'] #retours 'cc118d94a84f0ea37c64f14dd868a175' reqTwo = requests.get ('https://code.tutsplus.com/tutorial/) 'reqTwo.cookies [' _ _ tuts_session '] #returns' reqThree = ssnOne.get ('https://code.tutsplus.com/tutorials') reqThree.cookies ['_ tuts_session'] #returns '4c3dd2f41d2362108fbb191948eab3b4' 

Comme vous pouvez le constater, le cookie de session a une valeur différente dans les première et deuxième requêtes, mais il a la même valeur lorsque nous avons utilisé l'objet Session. Vous obtiendrez une valeur différente lorsque vous essaierez ce code, mais dans votre cas également, le cookie des demandes effectuées à l'aide de l'objet de session aura la même valeur..

Les sessions sont également utiles lorsque vous souhaitez envoyer les mêmes données pour toutes les demandes. Par exemple, si vous décidez d’envoyer un cookie ou un en-tête d’agent utilisateur contenant toutes les demandes à un domaine donné, vous pouvez utiliser des objets Session. Voici un exemple:

demandes d'importation ssn = requests.Session () ssn.cookies.update ('visit-month': 'February') reqOne = ssn.get ('http://httpbin.org/cookies') print (reqOne.text ) # affiche des informations sur le cookie "visit-month" reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'visit-year': '2017') print (reqTwo.text) # affiche des informations sur les cookies "visit-month" et "visit-year" reqThree = ssn.get ('http://httpbin.org/cookies') print (reqThree.text) # affiche des informations sur le cookie "visit-month" 

Comme vous pouvez le voir, le "mois de visite" Un cookie de session est envoyé avec les trois demandes. Cependant, le "année de visite" Le cookie est envoyé uniquement lors de la deuxième demande. Il n'y a aucune mention de la "vist-year" cookie dans la troisième demande aussi. Cela confirme le fait que les cookies ou autres données définies sur des requêtes individuelles ne seront pas envoyés avec d'autres requêtes de session..

Conclusion

Les concepts abordés dans ce didacticiel devraient vous aider à adresser des requêtes de base à un serveur en transmettant des en-têtes, des cookies ou des chaînes de requête spécifiques. Ce sera très utile lorsque vous essayez de gratter certaines pages Web pour plus d'informations. Maintenant, vous devriez également pouvoir télécharger automatiquement des fichiers de musique et des fonds d’écran de différents sites Web une fois que vous avez compris un motif dans les URL..

N'hésitez pas à voir ce que nous avons disponible à la vente et à étudier sur le marché, et n'hésitez pas à poser des questions et à fournir vos précieux commentaires en utilisant le flux ci-dessous.

Si vous avez des questions concernant ce tutoriel, merci de me le faire savoir dans les commentaires..

Apprendre le python

Apprenez Python avec notre guide complet de tutoriel sur Python, que vous soyez débutant ou que vous soyez un codeur chevronné cherchant à acquérir de nouvelles compétences..