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.
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 '
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)
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" '
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.
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 met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.