Bruk av forespørselsmodulen i Python

Forespørsler er en Python-modul som du kan bruke til å sende alle typer HTTP-forespørsler. Det er et brukervennlig bibliotek med mange funksjoner som strekker seg fra passerende parametre i nettadresser for å sende egendefinerte overskrifter og SSL-verifisering. I denne opplæringen lærer du hvordan du bruker dette biblioteket til å sende enkle HTTP-forespørsler i Python.

Du kan bruke Forespørsler med Python versjon 2.6-2.7 og 3.3-3.6. Før du fortsetter, bør du vite at Forespørsler er en ekstern modul, så du må installere den først før du prøver ut eksemplene i denne opplæringen. Du kan installere den ved å kjøre følgende kommando i terminalen:

pip installasjonsforespørsler

Når du har installert modulen, kan du kontrollere om den har blitt installert ved å importere den ved hjelp av denne kommandoen:

importer forespørsler

Hvis installasjonen har vært vellykket, vil du ikke se noen feilmeldinger.

Gjør en GET-forespørsel

Det er veldig enkelt å sende en HTTP-forespørsel ved hjelp av forespørsler. Du begynner med å importere modulen og deretter gjøre forespørselen. Her er et eksempel:

importforespørsler req = requests.get ('https://tutsplus.com/')

All informasjon om vår forespørsel er nå lagret i et Response-objekt som heter req. For eksempel kan du få kodingen av nettsiden ved hjelp av req.encoding eiendom. Du kan også få statuskoden til forespørselen ved hjelp av req.status_code eiendom.

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

Du kan få tilgang til informasjonskapslene som serveren sendte tilbake med req.cookies. På samme måte kan du få svarhodene ved å bruke req.headers. De req.headers Egenskapen returnerer en sak-følsom ordbok for svarhodene. Dette betyr at req.headers [ 'Content-Length']req.headers [ 'innholdslengde'] og req.headers [ 'innholdslengde'] vil alle returnere verdien av 'Content-Length' svar overskrift.

Du kan sjekke om svaret er en velformet HTTP-omdirigering som kunne ha blitt behandlet automatisk ved hjelp av req.is_redirect eiendom. Det kommer tilbake ekte eller Falsk basert på svaret. Du kan også få tiden som er gått mellom å sende forespørselen og komme tilbake et svar ved hjelp av req.elapsed eiendom.

Nettadressen du opprinnelig passerte til få() funksjonen kan være annerledes enn den endelige nettadressen til svaret av en rekke årsaker, inkludert viderekoblinger. For å se den endelige svaradressen, kan du bruke req.url eiendom.

import forespørsler req = requests.get ('http://www.tutsplus.com/') req.encoding # returnerer 'utf-8' req.status_code # returnerer 200 req.lapsed # returnerer datetime.timedelta (0, 1, 666890) req.url # returnerer 'https://tutsplus.com/' req.history # returnerer [, ] req.headers ['Content-Type'] # returnerer 'text / html; charset = utf-8' 

Å få all denne informasjonen om nettsiden du får tilgang til, er fin, men du vil sannsynligvis få tilgang til det faktiske innholdet. Hvis innholdet du får tilgang til, er tekst, kan du bruke req.text eiendom for å få tilgang til den. Innholdet blir deretter analysert som unicode. Du kan passere kodingen for å dekode teksten ved hjelp av req.encoding eiendom.

Ved ikke-tekst-svar kan du få tilgang til dem i binær form ved hjelp av req.content. Modulen vil automatisk dekode gzip og deflate transfer-kodinger. Dette kan være nyttig når du arbeider med mediefiler. På samme måte kan du få tilgang til det json-kodede innholdet i svaret, hvis det eksisterer, ved hjelp av req.json ().

Du kan også få det raske svaret fra serveren ved hjelp av req.raw. Husk at du må passere stream = True i forespørselen om å få det raske svaret.

Noen filer du laster ned fra Internett ved hjelp av modulen Forespørsler, kan ha stor størrelse. I slike tilfeller vil det ikke være lurt å laste hele svaret eller filen i minnet samtidig. Du kan laste ned en fil i stykker eller biter ved hjelp av iter_content (chunk_size = 1, decode_unicode = False) metode. 

Denne metoden iterates over svardataene i chunk_size antall byte på en gang. Når stream = True har blitt satt på forespørselen, vil denne metoden unngå å lese hele filen i minnet samtidig for store svar. De chunk_size parameteren kan enten være et heltall eller Ingen. Når satt til et heltall, chunk_size bestemmer antall byte som skal leses inn i minnet.

Når chunk_size er satt til Ingen og strøm er satt til ekte, dataene vil bli lest som det kommer i hvilken størrelse biter er mottatt. Når chunk_size er satt til Ingen og strøm er satt til Falsk, alle dataene blir returnert som en enkelt del.

La oss laste ned dette bildet av en skog på Pixabay ved hjelp av forespørselsmodulen. Her er det faktiske bildet:

Dette er koden du trenger:

import forespørsler req = requests.get ('path / to / forest.jpg', stream = True) req.raise_for_status () med åpne ('Forest.jpg', 'wb') som fd: for chunk i req.iter_content ( chunk_size = 50000): print ('Received a Chunk') fd.write (chunk)

De '/ Til / forest.jpg' er den faktiske bildeadressen; Du kan legge inn nettadressen til et annet bilde her for å laste ned noe annet. Den oppgitte bildefilen er 185kb i størrelse, og du har satt chunk_size til 50.000 byte. Dette betyr at meldingen "Received a Chunk" skal skrives ut fire ganger i terminalen. Størrelsen på det siste stykket vil bare være 39350 byte fordi den delen av filen som gjenstår å bli mottatt etter de tre første iterasjonene, er 39350 byte.

Forespørsler lar deg også passere parametere i en URL. Dette kan være nyttig når du søker på en nettside for noen resultater som et bestemt bilde eller opplæring. Du kan gi disse spørringsstrengene som en ordbok med strenger ved hjelp av params søkeord i GET-forespørselen. Her er et eksempel:

importforespørsler query = 'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600' req = requests.get ('https: // pixabay. com / no / photos / ', params = spørring) req.url # returnerer' https://pixabay.com/no/photos/?order=popular&min_height=600&q=Forest&min_width=800 '

Lag en POST-forespørsel

Å gjøre en POST-forespørsel er like enkelt som å lage GET-forespørsler. Du bruker bare post() funksjon i stedet for få(). Dette kan være nyttig når du sender inn skjemaer automatisk. For eksempel vil følgende kode laste ned hele Wikipedia-siden på nanoteknologi og lagre den på din PC.

import forespørsler req = requests.post ('https://en.wikipedia.org/w/index.php', data = 'search': 'Nanoteknologi') req.raise_for_status () med åpne ('Nanoteknologi.html ',' wb ') som fd: for chunk i req.iter_content (chunk_size = 50000): fd.write (chunk)

Sende informasjonskapsler og overskrifter

Som tidligere nevnt, kan du få tilgang til informasjonskapslene og overskriftene som serveren sender tilbake til deg ved hjelp av req.cookies og req.headers. Forespørsler lar deg også sende dine egne tilpassede informasjonskapsler og overskrifter med en forespørsel. Dette kan være nyttig når du vil, la oss si, sett inn en tilpasset brukeragent for forespørselen din.

Hvis du vil legge til HTTP-overskrifter på en forespørsel, kan du bare sende dem i en dict til overskrifter parameter. På samme måte kan du også sende dine egne informasjonskapsler til en server ved hjelp av en dict passert til kjeks parameter.

importforespørsler url = 'http://some-domain.com/set/cookies/headers' headers = 'user-agent': 'din-egen-bruker-agent / 0.0.1' cookies = 'visit- måned ':' februar ' req = requests.get (url, overskrifter = overskrifter, cookies = cookies) 

Cookies kan også bestilles i en Kokekanne. De gir et mer komplett grensesnitt slik at du kan bruke disse informasjonskapslene over flere baner. Her er et eksempel:

importere forespørsler jar = requests.cookies.RequestsCookieJar () jar.set ('first_cookie', 'first', domain = "httpbin.org", sti = "/ cookies") jar.set ('second_cookie', 'second' domain = "httpbin.org", sti = "/ ekstra") jar.set ('third_cookie', 'third', domain = "httpbin.org", sti = "/ cookies") url = 'http: // httpbin .org / cookies 'req = requests.get (url, cookies = jar) req.text # returnerer cookies: "first_cookie": "first", "third_cookie": "third"

Session Objekter

Noen ganger er det nyttig å bevare visse parametere på tvers av flere forespørsler. Session-objektet gjør akkurat det. For eksempel vil det fortsette informasjonskapsler over alle forespørsler gjort ved bruk av samme økt. Session-objektet bruker urllib3s tilkoblingssamling. Dette betyr at den underliggende TCP-tilkoblingen vil bli gjenbrukt for alle forespørsler gjort til den samme verten. Dette kan øke ytelsen betydelig. Du kan også bruke metoder i Forespørsler-objektet med Session-objektet.

Her er et eksempel på flere forespørsler sendt med og uten bruk av økter:

import forespørsler 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' 

Som du kan se har øktkaken en annen verdi i den første og andre forespørselen, men den har samme verdi når vi brukte sesjonsobjektet. Du får en annen verdi når du prøver denne koden, men i ditt tilfelle vil cookien for forespørslene gjort ved hjelp av øktobjektet ha samme verdi.

Økter er også nyttige når du vil sende de samme dataene i alle forespørsler. Hvis du for eksempel bestemmer deg for å sende en informasjonskapsel eller en brukeragent header med alle forespørsler til et gitt domene, kan du bruke sesjonsobjekter. Her er et eksempel:

importer forespørsler ssn = requests.Session () ssn.cookies.update ('besøk-måned': 'februar') reqOne = ssn.get ('http://httpbin.org/cookies') print (reqOne.text ) # skriver informasjon om "besøk-måned" -kake reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'besøkår': '2017') print (reqTwo.text) # skriver ut informasjon om "besøksmåned" og "besøkår" -kake reqThree = ssn.get ('http://httpbin.org/cookies') print (reqThree.text) # skriver informasjon om "besøksmåned" -kake 

Som du kan se, er "Besøk-måned" øktkake sendes med alle tre forespørsler. Imidlertid "Besøk-år" informasjonskapsel sendes kun under den andre forespørselen. Det er ingen omtale av "Vist-år" cookie i den tredje forespørselen også. Dette bekrefter det faktum at informasjonskapsler eller annet datasett på individuelle forespørsler ikke sendes med andre øktforespørsler.

Konklusjon

Begrepene som diskuteres i denne opplæringen, bør hjelpe deg med å lage grunnleggende forespørsler til en server ved å sende bestemte overskrifter, informasjonskapsler eller spørringsstrenger. Dette vil være veldig nyttig når du prøver å skrape noen nettsider for informasjon. Nå bør du også kunne laste ned musikkfiler og bakgrunnsbilder fra forskjellige nettsteder automatisk når du har funnet ut et mønster i nettadressene.

Ikke nøl med å se hva vi har tilgjengelig for salg og for studier på markedet, og ikke nøl med å stille spørsmål og gi din verdifulle tilbakemelding ved å bruke feedet under.

Hvis du har spørsmål angående denne opplæringen, vennligst gi meg beskjed i kommentarene.

Lær python

Lær Python med vår komplette pythonveiledning, enten du er bare i gang eller du er en erfaren coder som ønsker å lære nye ferdigheter..