Använda modulen för begäran i Python

Begäran är en Python-modul som du kan använda för att skicka alla typer av HTTP-förfrågningar. Det är ett lättanvänt bibliotek med många funktioner som sträcker sig från passande parametrar i webbadresser för att skicka anpassade rubriker och SSL-verifiering. I den här handledningen lär du dig hur du använder det här biblioteket för att skicka enkla HTTP-förfrågningar i Python.

Du kan använda Requests med Python version 2.6-2.7 och 3.3-3.6. Innan du fortsätter, bör du veta att begäran är en extern modul, så du måste installera den först innan du prövar exemplen i den här handledningen. Du kan installera det genom att köra följande kommando i terminalen:

pip installeringsförfrågningar

När du har installerat modulen kan du verifiera om den har blivit installerad genom att importera den med det här kommandot:

importförfrågningar

Om installationen har lyckats visas inga felmeddelanden.

Gör en GET-förfrågan

Det är väldigt lätt att skicka en HTTP-begäran med begäran. Du börjar med att importera modulen och sedan göra begäran. Här är ett exempel:

importförfrågningar req = requests.get ('https://tutsplus.com/')

All information om vår begäran lagras nu i ett svar-objekt som heter req. Till exempel kan du få kodningen av webbsidan med hjälp av req.encoding fast egendom. Du kan också få statuskoden för förfrågan med hjälp av req.status_code fast egendom.

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

Du kan komma åt de cookies som servern skickade tillbaka med req.cookies. På samma sätt kan du få svarhuvudena med req.headers. De req.headers egenskapen returnerar ett fall okänsligt ordbok av svarhuvud. Detta innebär att req.headers [ 'Content-Length']req.headers [ 'content-längd'] och req.headers [ 'CONTENT-LÄNGD'] kommer alla att returnera värdet av 'Content-Length' svarhuvud.

Du kan kontrollera om svaret är en välformad HTTP-omdirigering som kunde ha behandlats automatiskt med hjälp av req.is_redirect fast egendom. Det kommer att återvända Sann eller Falsk baserat på svaret. Du kan också få tiden mellan att skicka förfrågan och få tillbaka ett svar med hjälp av req.elapsed fast egendom.

Den URL som du ursprungligen passerade till skaffa sig() funktionen kan vara annorlunda än den slutliga URL-adressen för svaret av olika orsaker, inklusive omdirigeringar. För att se den slutliga svarsadressen kan du använda req.url fast egendom.

importförfrågningar req = requests.get ('http://www.tutsplus.com/') req.encoding # returnerar 'utf-8' req.status_code # returnerar 200 req.lapsed # returnerar datetime.timedelta (0, 1, 666890) req.url # returnerar 'https://tutsplus.com/' req.history # returnerar [, ] req.headers ['Content-Type'] # returnerar text / html; charset = utf-8' 

Att få all denna information om den webbsida du får åtkomst är bra, men du vill förmodligen få tillgång till det faktiska innehållet. Om innehållet du åtkomst är text kan du använda req.text egendom för att få tillgång till den. Innehållet analyseras sedan som unicode. Du kan skicka kodningen för att avkoda texten med req.encoding fast egendom.

När det gäller svar utan text kan du komma åt dem i binär form med req.content. Modulen avkodas automatiskt gzip och tömma överförings-kodningar. Detta kan vara till hjälp när du hanterar mediefiler. På samma sätt kan du komma åt det json-kodade innehållet i svaret, om det existerar, med req.json ().

Du kan också få det rätta svaret från servern med req.raw. Tänk på att du måste passera ström = True i begäran om att få det rätta svaret.

Vissa filer som du laddar ner från Internet med hjälp av modulen Begäran kan ha stor storlek. I sådana fall är det inte klokt att ladda hela svaret eller filen i minnet på en gång. Du kan ladda ner en fil i bitar eller bitar med hjälp av iter_content (chunk_size = 1, decode_unicode = False) metod. 

Denna metod repeterar över svardata i chunk_size Antal byte på en gång. När ström = True har ställts in på begäran, kommer denna metod att undvika att läsa hela filen i minnet samtidigt för stora svar. De chunk_size Parametern kan vara antingen ett heltal eller Ingen. När inställt på ett heltal värde, chunk_size bestämmer antalet byte som ska läsas i minnet.

När chunk_size är satt till Ingen och strömma är satt till Sann, Uppgifterna kommer att läsas när det kommer i vilken storlek som helst av bitar. När chunk_size är satt till Ingen och strömma är satt till Falsk, alla data kommer att returneras som en enda bit.

Låt oss ladda ner den här bilden av en skog på Pixabay med hjälp av modulen Requests. Här är den faktiska bilden:

Det här är koden du behöver:

importförfrågningar req = requests.get ('path / to / forest.jpg', stream = True) req.raise_for_status () med öppna ('Forest.jpg', 'wb') som fd: för chunk i req.iter_content ( chunk_size = 50000): print ('Received a Chunk') fd.write (chunk)

De 'Sökväg / till / forest.jpg' är den faktiska bildadressen; Du kan lägga till webbadressen till någon annan bild här för att ladda ner något annat. Den givna bildfilen är 185kb i storlek, och du har ställt in chunk_size till 50 000 byte. Det betyder att meddelandet "Received a Chunk" ska skrivas ut fyra gånger i terminalen. Storleken på den sista biten kommer bara att vara 39350 byte eftersom den del av filen som återstår att mottas efter de tre första iterationerna är 39350 byte.

Förfrågningar tillåter dig också att skicka parametrar i en URL-adress. Detta kan vara till hjälp när du söker på en webbsida för några resultat som en specifik bild eller handledning. Du kan tillhandahålla dessa frågesträngar som en ordbok med strängar med hjälp av params sökord i GET-förfrågan. Här är ett exempel:

importförfrågningar query = 'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600' req = requests.get ('https: // pixabay. com / sv / photos / ', params = query) req.url # returnerar' https://pixabay.com/sv/photos/?order=popular&min_height=600&q=Forest&min_width=800 '

Gör en POST-förfrågan

Att göra en POST-förfrågan är lika lätt som att göra GET-förfrågningar. Du använder bara posta() funktion istället för skaffa sig(). Detta kan vara användbart när du skickar in formulär automatiskt. Till exempel kommer följande kod att hämta hela Wikipedia-sidan om nanoteknik och spara den på din dator.

importförfrågningar req = requests.post ('https://en.wikipedia.org/w/index.php', data = 'search': 'Nanoteknologi') req.raise_for_status () med öppna ('Nanotechnology.html ',' wb ') som fd: för bit i req.iter_content (chunk_size = 50000): fd.write (chunk)

Skickar kakor och rubriker

Som tidigare nämnts kan du komma åt cookies och rubriker som servern skickar tillbaka till dig med req.cookies och req.headers. Förfrågningar tillåter dig även att skicka dina egna anpassade cookies och rubriker med en förfrågan. Detta kan vara till hjälp när du vill, låt oss säga, ange en anpassad användaragent för din förfrågan.

För att lägga till HTTP-rubriker på en förfrågan kan du helt enkelt skicka dem till en dict till headers parameter. På samma sätt kan du också skicka dina egna cookies till en server med hjälp av en dict passerade till småkakor parameter.

importförfrågningar url = 'http://some-domain.com/set/cookies/headers' headers = 'user-agent': 'din-egen-användare-agent / 0.0.1' cookies = 'visit- månad ':' februari ' req = requests.get (url, rubriker = rubriker, cookies = cookies) 

Kakor kan också skickas i en kakaburk. De ger ett mer komplett gränssnitt så att du kan använda dessa cookies över flera olika sökvägar. Här är ett exempel:

import requests jar = requests.cookies.RequestsCookieJar () jar.set ('first_cookie', 'first', domain = "httpbin.org", sökväg = "/ cookies") jar.set ('second_cookie', 'second' domain = "httpbin.org", sökväg = "/ extra") jar.set ("third_cookie", "third", domän = "httpbin.org", sökväg = "/ cookies") url = 'http: // httpbin .org / cookies 'req = requests.get (url, cookies = burk) req.text # returnerar "cookies": "first_cookie": "first", "third_cookie": "third"

Sessionobjekt

Ibland är det användbart att bevara vissa parametrar över flera förfrågningar. Sessionsobjektet gör exakt det. Till exempel kommer det att fortsätta cookie data över alla önskemål som gjorts med samma session. Sessionsobjektet använder urllib3s anslutningspooling. Det betyder att den underliggande TCP-anslutningen kommer att återanvändas för alla begäranden gjorda till samma värd. Detta kan avsevärt öka prestandan. Du kan också använda metoder för Objekt-objektet med Session-objektet.

Här är ett exempel på flera förfrågningar skickade med och utan att använda sessioner:

importförfrågningar 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 sessionskakan ett annat värde i den första och andra förfrågan, men den har samma värde när vi använde Sessionsobjektet. Du kommer att få ett annat värde när du provar den här koden, men i ditt fall kommer cookien för de begäranden som gjorts med hjälp av sessionsobjektet att ha samma värde.

Sessioner är också användbara när du vill skicka samma data över alla förfrågningar. Om du till exempel bestämmer att skicka en cookie eller en användaragentrubrik med alla förfrågningar till en viss domän kan du använda Sessionsobjekt. Här är ett exempel:

importförfrågningar ssn = requests.Session () ssn.cookies.update ('visit-month': 'februari') reqOne = ssn.get ('http://httpbin.org/cookies') print (reqOne.text ) # skriver information om "visit-month" -kakan reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'visitår': '2017') print (reqTwo.text) # skriver ut information om "visit-month" och "visit-year" cookie reqThree = ssn.get ('http://httpbin.org/cookies') print (reqThree.text) # skriver information om "visit-month" cookie 

Som du kan se, är "Besök månader" session cookie skickas med alla tre förfrågningarna. Men "Besök år" kakan skickas endast under den andra förfrågan. Det finns inget omnämnande av "Vist-år" cookie i den tredje förfrågan också. Detta bekräftar att cookies eller andra dataset för enskilda förfrågningar inte kommer att skickas med andra sessionförfrågningar.

Slutsats

Begreppen som diskuteras i denna handledning ska hjälpa dig att göra grundläggande förfrågningar till en server genom att skicka specifika rubriker, cookies eller frågesträngar. Detta kommer att vara väldigt användbart när du försöker skrapa några webbsidor för information. Nu borde du också kunna ladda ner musikfiler och bakgrundsbilder automatiskt från olika webbplatser när du har räknat ut ett mönster i webbadresserna.

Tveka inte att se vad vi har till salu och studera på marknaden, och tveka inte att ställa några frågor och ge din värdefulla feedback genom att använda foderet nedan.

Om du har några frågor angående denna handledning, vänligen meddela mig det i kommentarerna.

Lär Python

Lär dig Python med vår kompletta handledning för pythonhandledning, oavsett om du bara har börjat eller du är en erfaren kodare som vill lära dig nya färdigheter.