De Verzoekenmodule gebruiken in Python

Verzoeken is een Python-module die u kunt gebruiken om allerlei soorten HTTP-aanvragen te verzenden. Het is een eenvoudig te gebruiken bibliotheek met veel functies, variërend van het doorgeven van parameters in URL's tot het verzenden van aangepaste headers en SSL-verificatie. In deze zelfstudie leert u hoe u deze bibliotheek kunt gebruiken om eenvoudige HTTP-aanvragen in Python te verzenden.

U kunt verzoeken gebruiken met Python-versie 2.6-2.7 en 3.3-3.6. Voordat u verder gaat, moet u weten dat Verzoeken een externe module is, dus u moet het eerst installeren voordat u de voorbeelden in deze zelfstudie uitprobeert. U kunt het installeren door de volgende opdracht in de terminal uit te voeren:

pip install requests

Nadat u de module hebt geïnstalleerd, kunt u controleren of deze met succes is geïnstalleerd door deze te importeren met behulp van deze opdracht:

importeer verzoeken

Als de installatie is gelukt, ziet u geen foutmeldingen.

Een GET-verzoek doen

Het is heel eenvoudig om een ​​HTTP-verzoek te verzenden met behulp van Verzoeken. U begint met het importeren van de module en maakt vervolgens het verzoek. Hier is een voorbeeld:

importeer verzoeken req = requests.get ('https://tutsplus.com/')

Alle informatie over ons verzoek wordt nu opgeslagen in een genoemd Response-object req. U kunt bijvoorbeeld de codering van de webpagina verkrijgen met behulp van de req.encoding eigendom. U kunt ook de statuscode van het verzoek opvragen met behulp van de req.status_code eigendom.

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

U hebt toegang tot de cookies die door de server zijn verzonden req.cookies. Op dezelfde manier kunt u de responskoppen gebruiken req.headers. De req.headers eigenschap retourneert een hoofdletterongevoelig woordenboek van antwoordheaders. Dit betekent dat req.headers [ 'Content-Length']req.headers [ 'content-length'] en req.headers [ 'CONTENT-LENGTH'] zullen allemaal de waarde van de 'Inhoud lengte' antwoordkop.

U kunt controleren of het antwoord een goed gevormde HTTP-omleiding is die automatisch zou kunnen zijn verwerkt met behulp van de req.is_redirect eigendom. Het zal terugkeren waar of vals op basis van het antwoord. U kunt ook de tijd krijgen die verstrijkt tussen het verzenden van het verzoek en het ontvangen van een antwoord met behulp van de req.elapsed eigendom.

De URL die u in eerste instantie hebt doorgegeven aan de krijgen() functie kan om verschillende redenen, waaronder omleidingen, anders zijn dan de uiteindelijke URL van het antwoord. Om de uiteindelijke respons-URL te zien, kunt u de req.url eigendom.

importeer verzoeken req = requests.get ('http://www.tutsplus.com/') req.encoding # retourneert 'utf-8' req.status_code # retourneert 200 req.elapsed # retourneert datetime.timedelta (0, 1, 666890) req.url # retourneert 'https://tutsplus.com/' req.history # retourneert [, ] req.headers ['Content-type'] # geeft 'text / html; charset = UTF-8' 

Het verkrijgen van al deze informatie over de webpagina die u bezoekt is leuk, maar u wilt waarschijnlijk toegang tot de daadwerkelijke inhoud. Als de inhoud die u gebruikt tekst is, kunt u de req.text eigendom om toegang te krijgen. De inhoud wordt vervolgens geparseerd als unicode. U kunt de codering doorgeven om de tekst te decoderen met behulp van de req.encoding eigendom.

In het geval van niet-tekstantwoorden, kunt u deze in binaire vorm openen met req.content. De module zal automatisch decoderen gzip en deflatie veroorzaken transfer-coderingen. Dit kan handig zijn als u te maken hebt met mediabestanden. Op dezelfde manier hebt u toegang tot de json-gecodeerde inhoud van het antwoord, als dit bestaat, met behulp van req.json ().

U kunt ook de onbewerkte reactie krijgen van de server die gebruikt req.raw. Houd er rekening mee dat je moet slagen stroom = True in het verzoek om de onbewerkte reactie te krijgen.

Sommige bestanden die u downloadt van internet met behulp van de module Verzoeken hebben mogelijk een enorme omvang. In dergelijke gevallen is het niet verstandig om de hele respons of het hele bestand in één keer in het geheugen te laden. U kunt een bestand in stukjes of chunks downloaden met behulp van de iter_content (chunk_size = 1, decode_unicode = False) methode. 

Deze methode itereert over de responsgegevens in formaat van een blokje aantal bytes tegelijk. Wanneer stroom = True is ingesteld op het verzoek, zal deze methode voorkomen dat het hele bestand in het geheugen wordt gelezen voor grote antwoorden. De formaat van een blokje parameter kan een geheel getal of Geen. Wanneer ingesteld op een geheel getal, formaat van een blokje bepaalt het aantal bytes dat in het geheugen moet worden gelezen.

Wanneer formaat van een blokje ingesteld op Geen en stroom ingesteld op waar, de gegevens worden gelezen zodra deze binnenkomen in de grootte van de chunks die worden ontvangen. Wanneer formaat van een blokje ingesteld op Geen en stroom ingesteld op vals, alle gegevens worden als een enkel stuk geretourneerd.

Laten we deze afbeelding van een forest op Pixabay downloaden met behulp van de module Verzoeken. Hier is de daadwerkelijke afbeelding:

Dit is de code die je nodig hebt:

importeer verzoeken req = requests.get ('path / to / forest.jpg', stream = True) req.raise_for_status () met open ('Forest.jpg', 'wb') als fd: voor chunk in req.iter_content ( chunk_size = 50000): print ('Received a Chunk') fd.write (chunk)

De 'Path / to / forest.jpg' is de daadwerkelijke afbeeldings-URL; je kunt de URL van elke andere afbeelding hier plaatsen om iets anders te downloaden. Het opgegeven afbeeldingsbestand is 185 kb groot en u hebt ingesteld formaat van een blokje tot 50.000 bytes. Dit betekent dat het bericht "Received a Chunk" vier keer moet worden afgedrukt in de terminal. De grootte van het laatste blok is slechts 39350 bytes, omdat het deel van het bestand dat na de eerste drie iteraties nog moet worden ontvangen 39350 bytes is.

Met verzoeken kunt u ook parameters in een URL doorgeven. Dit kan handig zijn als u op een webpagina zoekt naar resultaten zoals een specifieke afbeelding of zelfstudie. U kunt deze queryreeksen als een woordenboek van strings opgeven met behulp van de params zoekwoord in het GET-verzoek. Hier is een voorbeeld:

import requests query = 'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600' req = requests.get ('https: // pixabay. com / en / photos / ', params = query) req.url # retourneert' https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800 '

Een POST-aanvraag doen

Het maken van een POST-aanvraag is net zo eenvoudig als het doen van GET-verzoeken. Je gebruikt gewoon de post() functie in plaats van krijgen(). Dit kan handig zijn wanneer u formulieren automatisch verzendt. De volgende code zal bijvoorbeeld de hele Wikipedia-pagina over Nanotechnologie downloaden en op uw pc opslaan.

import requests req = requests.post ('https://en.wikipedia.org/w/index.php', data = 'search': 'Nanotechnology') req.raise_for_status () with open ('Nanotechnology.html ',' wb ') als fd: voor chunk in req.iter_content (chunk_size = 50000): fd.write (chunk)

Cookies en headers verzenden

Zoals eerder vermeld, kunt u toegang krijgen tot de cookies en headers die de server naar u terugstuurt req.cookies en req.headers. Met verzoeken kunt u ook uw eigen aangepaste cookies en berichtkoppen verzenden met een verzoek. Dit kan handig zijn als u, laten we zeggen, een aangepaste user-agent voor uw aanvraag wilt instellen.

Als u HTTP-headers aan een verzoek wilt toevoegen, kunt u deze gewoon doorgeven in a dict naar de headers parameter. Op dezelfde manier kunt u ook uw eigen cookies naar een server sturen met behulp van een dict doorgegeven aan de koekjes parameter.

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

Cookies kunnen ook worden doorgegeven in een Cookie Jar. Ze bieden een completere interface om u in staat te stellen deze cookies via meerdere paden te gebruiken. Hier is een voorbeeld:

importeer verzoeken 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 # retourneert' "cookies": "first_cookie": "first", "third_cookie": "third" '

Sessie-objecten

Soms is het handig om bepaalde parameters over meerdere verzoeken te behouden. Het Session-object doet precies dat. Het houdt bijvoorbeeld cookiedata bij voor alle aanvragen die met dezelfde sessie zijn gedaan. Het Session-object maakt gebruik van de pooling van verbindingsnetwerken van urllib3. Dit betekent dat de onderliggende TCP-verbinding zal worden hergebruikt voor alle verzoeken aan dezelfde host. Dit kan de prestaties aanzienlijk verbeteren. U kunt ook methoden van het object Aanvragen gebruiken met het Session-object.

Hier is een voorbeeld van meerdere verzoeken verzonden met en zonder gebruik van sessies:

importeer verzoeken 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 = requests.Session () ssnOne.get (' https://tutsplus.com/ ') ssnOne.cookies [' _ tuts_session '] #returns' 4c3dd2f41d2362108fbb191448eab3b4 ' reqThree = ssnOne.get ('https://code.tutsplus.com/tutorials') reqThree.cookies ['_ tuts_session'] #returns '4c3dd2f41d2362108fbb191448eab3b4' 

Zoals u kunt zien, heeft de sessiecookie een andere waarde in het eerste en tweede verzoek, maar heeft deze dezelfde waarde wanneer we het Session-object gebruikten. U krijgt een andere waarde wanneer u deze code uitprobeert, maar in uw geval heeft de cookie voor de verzoeken die met het sessieobject zijn gemaakt dezelfde waarde.

Sessies zijn ook handig als u dezelfde gegevens over alle verzoeken wilt verzenden. Als u bijvoorbeeld besluit een cookie of gebruikersagent-header te verzenden met alle aanvragen naar een bepaald domein, kunt u sessieobjecten gebruiken. Hier is een voorbeeld:

importeer verzoeken ssn = requests.Session () ssn.cookies.update ('visit-month': 'February') reqOne = ssn.get ('http://httpbin.org/cookies') print (reqOne.text ) # print informatie over "bezoek-maand" cookie reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'visit-year': '2017') print (reqTwo.text) # print informatie over "bezoek-maand" en "bezoek-jaar" cookie reqThree = ssn.get ('http://httpbin.org/cookies') print (reqThree.text) # print informatie over "bezoek-maand" cookie 

Zoals u kunt zien, de "Visit-maand" sessiecookie wordt met alle drie verzoeken verzonden. echter, de "Visit-jaar" cookie wordt alleen verzonden tijdens het tweede verzoek. Er is geen sprake van de "Vist-jaar" cookie ook in het derde verzoek. Dit bevestigt het feit dat cookies of andere gegevens die zijn ingesteld voor individuele verzoeken niet met andere sessieverzoeken worden verzonden.

Conclusie

De concepten die in deze zelfstudie worden besproken, helpen u bij het maken van basisverzoeken naar een server door specifieke koppen, cookies of queryreeksen door te geven. Dit is erg handig als u sommige webpagina's probeert te schrapen ter informatie. Nu zou je ook in staat moeten zijn om automatisch muziekbestanden en achtergronden van verschillende websites te downloaden als je eenmaal een patroon in de URL's hebt uitgezocht.

Aarzel niet om te zien wat we beschikbaar hebben voor de verkoop en voor studie in de markt, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.

Als je nog vragen hebt over deze tutorial, laat het me dan weten in de comments.

Leer Python

Leer Python met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.