Utilizarea modulului Requests în Python

Solicitările este un modul Python pe care îl puteți utiliza pentru a trimite toate tipurile de cereri HTTP. Este o bibliotecă ușor de folosit, cu o mulțime de caracteristici, de la parcurgerea parametrilor în adresele URL la trimiterea antetelor personalizate și verificarea SSL. În acest tutorial, veți învăța cum să utilizați această bibliotecă pentru a trimite cereri HTTP simple în Python.

Puteți utiliza Solicitări cu Python versiunea 2.6-2.7 și 3.3-3.6. Înainte de a continua, trebuie să știți că Requests este un modul extern, deci va trebui să îl instalați mai întâi înainte de a încerca exemplele din acest tutorial. Puteți să o instalați executând următoarea comandă în terminal:

cerințele de instalare pentru pip

Odată ce ați instalat modulul, puteți verifica dacă a fost instalat cu succes prin importarea acestuia utilizând următoarea comandă:

cererile de import

Dacă instalarea a avut succes, nu veți vedea mesaje de eroare.

Efectuarea unei solicitări GET

Este foarte ușor să trimiteți o solicitare HTTP folosind Solicitări. Începeți prin importarea modulului și apoi efectuați solicitarea. Iată un exemplu:

cereri de import req = requests.get ('https://tutsplus.com/')

Toate informațiile despre solicitarea noastră sunt acum stocate într-un obiect Response numit req. De exemplu, puteți obține codarea paginii Web folosind req.encoding proprietate. De asemenea, puteți obține codul de stare al solicitării utilizând req.status_code proprietate.

req.encoding # returnează 'utf-8' req.status_code # returnează 200

Puteți accesa modulele cookie pe care serverul le-a trimis înapoi req.cookies. În mod similar, puteți utiliza anteturile de răspuns req.headers. req.headers proprietatea returnează un dicționar cu majuscule de răspuns. Aceasta înseamnă că req.headers [ 'Content-Length']req.headers [ „conținut de lungime“] și req.headers [ 'CONȚINUT-LUNGIMEA'] va întoarce toate valorile 'Content-Length' răspuns antet.

Puteți verifica dacă răspunsul este o redirecționare HTTP bine formată care ar fi putut fi procesată automat utilizând req.is_redirect proprietate. Se va întoarce Adevărat sau Fals pe baza răspunsului. Puteți, de asemenea, obține timpul scurs între trimiterea solicitării și primirea unui răspuns folosind req.elapsed proprietate.

Adresa URL pe care ați trecut inițial la obține() funcția poate fi diferită de adresa URL finală a răspunsului dintr-o varietate de motive, inclusiv redirecționări. Pentru a vedea adresa URL de răspuns finală, puteți utiliza funcția req.url proprietate.

cereri de import req = requests.get ('http://www.tutsplus.com/') req.encoding # returnează 'utf-8' req.status_code # returnează 200 req elapsed # returnează datetime.timedelta (0, 1, 666890) req.url # returnează "https://tutsplus.com/ 'req.history # returns [, ] req.headers ['Content-Type'] # returnează 'text / html; charset = utf-8' 

Obținerea tuturor acestor informații despre pagina pe care o accesați este plăcută, dar probabil că doriți să accesați conținutul real. Dacă conținutul pe care îl accesați este text, puteți utiliza req.text de proprietate pentru ao accesa. Conținutul este apoi analizat ca unicode. Puteți transmite codificarea cu care să decodificați textul utilizând req.encoding proprietate.

În cazul răspunsurilor non-text, le puteți accesa în formă binară utilizând req.content. Modulul va decoda în mod automat gzip și dezumfla de transfer-codificări. Acest lucru poate fi util atunci când aveți de-a face cu fișiere media. În mod similar, puteți accesa conținutul codificat de json al răspunsului, dacă există, utilizând req.json ().

De asemenea, puteți obține răspunsul brut de la server folosind req.raw. Rețineți că va trebui să treceți curs de apa = Adevărat în cererea de a primi răspunsul brut.

Unele fișiere pe care le descărcați de pe internet utilizând modulul Solicitări pot avea o dimensiune uriașă. În astfel de cazuri, nu va fi înțelept să încărcați dintr-o dată întregul răspuns sau fișier din memorie. Puteți descărca un fișier în bucăți sau bucăți folosind iter_content (chunk_size = 1, decode_unicode = False) metodă. 

Această metodă trece peste datele de răspuns din chunk_size numărul de octeți dintr-o dată. Cand curs de apa = Adevărat a fost setat la cerere, această metodă va evita citirea întregului fișier în memorie o dată pentru răspunsuri mari. chunk_size parametrul poate fi un număr întreg sau Nici unul. Când este setată la o valoare întregă, chunk_size determină numărul de octeți care ar trebui citiți în memorie.

Cand chunk_size este setat sa Nici unul și curent este setat sa Adevărat, datele vor fi citite pe măsură ce vor ajunge în orice dimensiune a bucăților primite. Cand chunk_size este setat sa Nici unul și curent este setat sa Fals, toate datele vor fi returnate ca o singură bucată.

Să descărcăm această imagine a unei păduri pe Pixabay folosind modulul Solicitări. Aici este imaginea reală:

Acesta este codul de care aveți nevoie:

cererile de import req = requests.get ('path / to / forest.jpg', stream = True) req.raise_for_status () cu open ('Forest.jpg', 'wb' chunk_size = 50000): imprimare ('Received a Chunk') fd.write (bucată)

'Calea / spre / forest.jpg' este adresa URL a imaginii reale; puteți pune adresa URL a oricărei alte imagini aici pentru a descărca altceva. Fișierul imagine dat are o dimensiune de 185kb și ați setat chunk_size la 50.000 de octeți. Aceasta înseamnă că mesajul "Received a Chunk" trebuie tipărit de patru ori în terminal. Marimea ultimei bucăți va fi de numai 39350 octeți deoarece partea din fișier care rămâne să fie primită după primele trei iterații este de 39350 octeți.

Cererile vă permit, de asemenea, să transmiteți parametrii într-o adresă URL. Acest lucru poate fi util atunci când căutați o pagină web pentru anumite rezultate, cum ar fi o imagine specifică sau un tutorial. Puteți furniza aceste șiruri de interogări ca un dicționar de șiruri folosind params cuvânt cheie în cererea GET. Iată un exemplu:

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

Efectuarea unei solicitări POST

Efectuarea unei solicitări POST este la fel de ușor ca și efectuarea solicitărilor GET. Folosiți doar post() în loc de obține(). Acest lucru poate fi util atunci când trimiteți automat formulare. De exemplu, următorul cod va descărca întreaga pagină Wikipedia despre Nanotehnologia și îl va salva pe PC.

cereri de import req = requests.post ('https://en.wikipedia.org/w/index.php', data = 'căutare': 'Nanotehnologie') req.raise_for_status () cu open ('Nanotechnology.html ',' wb ') ca fd: pentru bucata din req.iter_content (chunk_size = 50000): fd.write (bucată)

Trimiterea cookie-urilor și anteturilor

După cum am menționat anterior, puteți accesa modulele cookie și anteturile pe care serverul le trimite înapoi req.cookies și req.headers. Solicitările vă permit de asemenea să trimiteți propriile cookie personalizate și antete cu o cerere. Acest lucru poate fi util atunci când doriți, să presupunem, să setați un agent utilizator personalizat pentru solicitarea dvs..

Pentru a adăuga anteturile HTTP la o solicitare, le puteți pur și simplu să le transmiteți într-un dict la antete parametru. În mod similar, puteți, de asemenea, să trimiteți propriile module cookie la un server folosind un dict trecut la fursecuri parametru.

solicitări de import url = 'http://some-domain.com/set/cookies/headers' headers = 'user-agent': 'your-own-user-agent / 0.0.1' cookies = lună ':' februarie ' req = requests.get (url, headers = headers, cookies = cookies) 

Cookie-urile pot fi de asemenea transmise într-un Jar Cookie. Acestea oferă o interfață mai completă pentru a vă permite să utilizați aceste cookie-uri pe mai multe căi. Iată un exemplu:

cererile de import jar = requests.cookies.RequestsCookieJar () jar.set ('first_cookie', 'first', domain = "httpbin.org", path = "/ cookies" domeniu = "httpbin.org", path = "/ extra") jar.set ('third_cookie', 'a treia', domain = "httpbin.org", path = "cookies") "cookies": "first_cookie": "prima", "third_cookie": "a treia"

Sesiuni de obiecte

Uneori este util să păstrați anumiți parametri în mai multe solicitări. Obiectul Session face exact asta. De exemplu, va persista datele cookie în toate solicitările făcute utilizând aceeași sesiune. Obiectul Session folosește pooling-ul conexiunii urllib3. Aceasta înseamnă că conexiunea TCP subiacentă va fi reutilizată pentru toate solicitările adresate aceleiași gazde. Acest lucru poate spori semnificativ performanța. De asemenea, puteți utiliza metodele obiectului Requests cu obiectul Session.

Iată un exemplu de solicitări multiple trimise cu și fără utilizarea sesiunilor:

cererile de import reqOne = requests.get ('https://tutsplus.com/') reqOne.cookies ['_ tuts_session'] #returns 'cc118d94a84f0ea37c64f14dd868a175' reqTwo = requests.get ('https://code.tutsplus.com/tutorials ') ssnOne.get (' https://tutsplus.com/ ') ssnOne.cookies [' _ tuts_session '] #returns' 4c3dd2f41d2362108fbb191448eab3b4 'ssnOne.get (' reqThree = ssnOne.get ('https://code.tutsplus.com/tutorials') reqThree.cookies ['_ tuts_session'] #returns '4c3dd2f41d2362108fbb191448eab3b4' 

După cum puteți vedea, cookie-ul de sesiune are o valoare diferită în prima și a doua solicitare, dar are aceeași valoare când am folosit obiectul Session. Veți obține o valoare diferită atunci când încercați acest cod, dar și în cazul dvs., cookie-ul pentru cererile făcute utilizând obiectul sesiunii va avea aceeași valoare.

Sesiunile sunt, de asemenea, utile atunci când doriți să trimiteți aceleași date în toate solicitările. De exemplu, dacă decideți să trimiteți un cookie sau un antet de utilizator-agent cu toate solicitările către un anumit domeniu, puteți utiliza obiectele sesiunii. Iată un exemplu:

cererile de import ssn = requests.Session () ssn.cookies.update ('luna vizitei': 'februarie') reqOne = ssn.get ('http://httpbin.org/cookies') print (reqOne.text ) # imprimă informații despre cookie-ul "vizită-lună" reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'anul de vizitare': '2017')) print (reqTwo.text) tipăriți informații despre cookie-urile "vizită-lună" și "anul de vizită" reqThree = ssn.get ('http://httpbin.org/cookies') print (reqThree.text) # imprimă informații despre cookie-ul "vizită-lună" 

După cum puteți vedea, „Vizita luni“ cookie de sesiune este trimis cu toate cele trei solicitări. Însă „Vizita de ani“ fișierul cookie este trimis numai în timpul celei de-a doua solicitări. Nu există nicio mențiune despre "Vist-an" cookie în a treia cerere. Acest lucru confirmă faptul că cookie-urile sau alte setări de date pe solicitări individuale nu vor fi trimise împreună cu alte solicitări de sesiune.

Concluzie

Conceptele discutate în acest tutorial vă vor ajuta să faceți cereri de bază pentru un server prin trecerea antetelor specifice, cookie-urilor sau arurilor de interogare. Acest lucru va fi foarte util atunci când încercați să răsturnați unele pagini web pentru informații. De asemenea, ar trebui să puteți descărca automat fișiere muzicale și imagini de fundal de pe diferite site-uri, odată ce ați dat seama la un model în adresele URL.

Nu ezitați să vedeți ceea ce avem la dispoziție pentru vânzare și pentru a studia pe piață și nu ezitați să puneți întrebări și să oferiți feedback-ul dvs. valoros utilizând feedul de mai jos.

Dacă aveți întrebări cu privire la acest tutorial, vă rugăm să ne anunțați în comentarii.

Aflați Python

Aflați Python cu ghidul nostru complet de instrucțiuni Python, indiferent dacă sunteți doar începători sau sunteți un coder experimentat în căutarea unor noi abilități.

Cod