Utilizzo del modulo richieste in Python

Requests è un modulo Python che è possibile utilizzare per inviare tutti i tipi di richieste HTTP. È una libreria di facile utilizzo con molte funzionalità che vanno dal passaggio dei parametri negli URL all'invio di intestazioni personalizzate e alla verifica SSL. In questo tutorial imparerai come utilizzare questa libreria per inviare semplici richieste HTTP in Python.

Puoi usare Requests con Python versione 2.6-2.7 e 3.3-3.6. Prima di proseguire, dovresti sapere che Requests è un modulo esterno, quindi dovrai installarlo prima di provare gli esempi in questo tutorial. Puoi installarlo eseguendo il seguente comando nel terminale:

richieste di installazione di pip

Una volta installato il modulo, è possibile verificare se è stato installato correttamente importandolo utilizzando questo comando:

richieste di importazione

Se l'installazione ha avuto successo, non vedrai alcun messaggio di errore.

Fare una richiesta GET

È molto facile inviare una richiesta HTTP usando Requests. Inizi importando il modulo e poi fai la richiesta. Ecco un esempio:

richieste di importazione req = requests.get ('https://tutsplus.com/')

Tutte le informazioni sulla nostra richiesta sono ora memorizzate in un oggetto Response chiamato req. Ad esempio, puoi ottenere la codifica della pagina web usando il req.encoding proprietà. Puoi anche ottenere il codice di stato della richiesta usando il req.status_code proprietà.

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

È possibile accedere ai cookie che il server ha restituito utilizzando req.cookies. Allo stesso modo, puoi ottenere le intestazioni di risposta usando req.headers. Il req.headers proprietà restituisce un dizionario case sensitive di intestazioni di risposta. Ciò significa che req.headers [ 'Content-Length']req.headers [ 'content-length']req.headers [ 'Content-Length'] restituirà tutti il ​​valore di 'Content-Length' intestazione di risposta.

È possibile verificare se la risposta è un reindirizzamento HTTP ben formato che potrebbe essere stato elaborato automaticamente utilizzando req.is_redirect proprietà. Ritornerà Vero o falso in base alla risposta. È inoltre possibile ottenere il tempo trascorso tra l'invio della richiesta e il recupero di una risposta utilizzando il comando req.elapsed proprietà.

L'URL che hai inizialmente passato al ottenere() la funzione può essere diversa dall'URL finale della risposta per una serie di motivi, inclusi i reindirizzamenti. Per vedere l'URL di risposta finale, puoi utilizzare il req.url proprietà.

richieste di importazione req = requests.get ('http://www.tutsplus.com/') req.encoding # restituisce 'utf-8' req.status_code # restituisce 200 req.elapsed # restituisce datetime.timedelta (0, 1, 666890) req.url # restituisce 'https://tutsplus.com/' req.history # restituisce [, ] req.headers ['Content-Type'] # restituisce 'text / html; charset = utf-8' 

Ottenere tutte queste informazioni sulla pagina web a cui si accede è bello, ma probabilmente si desidera accedere ai contenuti reali. Se il contenuto a cui accedi è un testo, puoi utilizzare il req.text proprietà per accedervi. Il contenuto viene quindi analizzato come unicode. Puoi passare la codifica con cui decodificare il testo usando il req.encoding proprietà.

Nel caso di risposte non testuali, è possibile accedervi in ​​formato binario utilizzando req.content. Il modulo decodificherà automaticamente gzip e sgonfiare trasferimento-codifiche. Questo può essere utile quando hai a che fare con file multimediali. Allo stesso modo, è possibile accedere al contenuto della risposta json della risposta, se esistente, utilizzando req.json ().

È inoltre possibile ottenere la risposta non elaborata dal server utilizzando req.raw. Tieni presente che dovrai passare flusso = True nella richiesta di ottenere la risposta grezza.

Alcuni file scaricati da Internet utilizzando il modulo Richieste potrebbero avere dimensioni enormi. In questi casi, non sarà saggio caricare l'intera risposta o il file nella memoria in una sola volta. Puoi scaricare un file in pezzi o blocchi usando il iter_content (chunk_size = 1, decode_unicode = False) metodo. 

Questo metodo esegue un'iterazione sui dati di risposta in chunk_size numero di byte contemporaneamente. quando flusso = True è stato impostato sulla richiesta, questo metodo eviterà di leggere l'intero file in memoria in una sola volta per grandi risposte. Il chunk_size parametro può essere un numero intero o Nessuna. Se impostato su un valore intero, chunk_size determina il numero di byte che dovrebbero essere letti nella memoria.

quando chunk_size è impostato per Nessuna e ruscello è impostato per Vero, i dati verranno letti non appena arrivano in qualsiasi dimensione dei blocchi ricevuti. quando chunk_size è impostato per Nessuna e ruscello è impostato per falso, tutti i dati verranno restituiti come un singolo blocco.

Scarichiamo questa immagine di una foresta su Pixabay usando il modulo Richieste. Ecco l'immagine attuale:

Questo è il codice che ti serve:

richieste di importazione req = requests.get ('path / to / forest.jpg', stream = True) req.raise_for_status () con open ('Forest.jpg', 'wb') come fd: per chunk in req.iter_content ( chunk_size = 50000): print ('Received a Chunk') fd.write (chunk)

Il 'Path / to / forest.jpg' è l'URL dell'immagine reale; puoi mettere l'URL di qualsiasi altra immagine qui per scaricare qualcos'altro. Il file immagine dato ha una dimensione di 185kb e tu hai impostato chunk_size a 50.000 byte. Ciò significa che il messaggio "Received a Chunk" dovrebbe essere stampato quattro volte nel terminale. La dimensione dell'ultimo blocco sarà solo 39350 byte poiché la parte del file che rimane da ricevere dopo le prime tre iterazioni è 39350 byte.

Le richieste consentono anche di passare i parametri in un URL. Questo può essere utile quando stai cercando una pagina web per alcuni risultati come un'immagine o un'esercitazione specifica. È possibile fornire queste stringhe di query come un dizionario di stringhe utilizzando params parola chiave nella richiesta GET. Ecco un esempio:

richieste di importazione query = 'q': 'Foresta', 'ordine': 'popolare', 'min_width': '800', 'min_height': '600' req = requests.get ('https: // pixabay. it / it / photos / ', params = query) req.url # restituisce' https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800 '

Fare una richiesta POST

Fare una richiesta POST è altrettanto semplice che fare richieste GET. Tu usi semplicemente il inviare() funzione al posto di ottenere(). Questo può essere utile quando si inviano automaticamente moduli. Ad esempio, il seguente codice scaricherà l'intera pagina di Wikipedia su Nanotecnologia e la salverà sul tuo PC.

richieste di importazione req = requests.post ('https://en.wikipedia.org/w/index.php', data = 'search': 'Nanotechnology') req.raise_for_status () con open ('Nanotechnology.html ',' wb ') come fd: per chunk in req.iter_content (chunk_size = 50000): fd.write (chunk)

Invio di cookie e intestazioni

Come accennato in precedenza, è possibile accedere ai cookie e alle intestazioni che il server invia all'utente utilizzando req.cookies e req.headers. Le richieste ti consentono anche di inviare i tuoi cookie e intestazioni personalizzati con una richiesta. Ciò può essere utile quando si desidera, diciamo, impostare un agente utente personalizzato per la richiesta.

Per aggiungere intestazioni HTTP a una richiesta, puoi semplicemente passarle in a dict al intestazioni parametro. Allo stesso modo, puoi anche inviare i tuoi cookie a un server utilizzando un dict passato al biscotti parametro.

richieste di importazione url = 'http://some-domain.com/set/cookies/headers' intestazioni = 'user-agent': 'your-own-user-agent / 0.0.1' cookies = 'visit- mese ':' Febbraio ' req = requests.get (url, intestazioni = intestazioni, cookie = cookie) 

I cookie possono anche essere passati in un barattolo di biscotti. Forniscono un'interfaccia più completa per consentire all'utente di utilizzare tali cookie su più percorsi. Ecco un esempio:

richieste di importazione jar = requests.cookies.RequestsCookieJar () jar.set ('first_cookie', 'first', domain = "httpbin.org", path = "/ cookies") jar.set ('second_cookie', 'second', domain = "httpbin.org", percorso = "/ extra") jar.set ('third_cookie', 'third', domain = "httpbin.org", percorso = "/ cookies") url = 'http: // httpbin .org / cookies 'req = requests.get (url, cookie = jar) req.text # restituisce' "cookies": "first_cookie": "first", "third_cookie": "third" '

Oggetti di sessione

A volte è utile conservare determinati parametri tra più richieste. L'oggetto Session fa esattamente questo. Ad esempio, i dati dei cookie verranno mantenuti per tutte le richieste effettuate utilizzando la stessa sessione. L'oggetto Session utilizza il pool di connessioni di urllib3. Ciò significa che la connessione TCP sottostante verrà riutilizzata per tutte le richieste fatte allo stesso host. Questo può aumentare significativamente le prestazioni. È inoltre possibile utilizzare i metodi dell'oggetto Richieste con l'oggetto Session.

Ecco un esempio di più richieste inviate con e senza utilizzare le sessioni:

richieste di importazione 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' 

Come puoi vedere, il cookie di sessione ha un valore diverso nella prima e nella seconda richiesta, ma ha lo stesso valore quando abbiamo usato l'oggetto Session. Avrai un valore diverso quando proverai questo codice, ma anche nel tuo caso il cookie per le richieste fatte usando l'oggetto session avrà lo stesso valore.

Le sessioni sono anche utili quando si desidera inviare gli stessi dati per tutte le richieste. Ad esempio, se si decide di inviare un cookie o un'intestazione user-agent con tutte le richieste a un determinato dominio, è possibile utilizzare gli oggetti Session. Ecco un esempio:

richieste di importazione ssn = requests.Session () ssn.cookies.update ('visit-month': 'February') reqOne = ssn.get ('http://httpbin.org/cookies') print (reqOne.text # stampa le informazioni sul cookie "visit-month" reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'visit-year': '2017') print (reqTwo.text) # stampa informazioni su cookie "visit-month" e "visit-year" reqThree = ssn.get ('http://httpbin.org/cookies') print (reqThree.text) # stampa informazioni sul cookie "visit-month" 

Come puoi vedere, il "Visita mesi" il cookie di sessione viene inviato con tutte e tre le richieste. comunque, il "Visita-anno" il cookie viene inviato solo durante la seconda richiesta. Non c'è menzione del "Vist-anno" cookie anche nella terza richiesta. Ciò conferma il fatto che i cookie o altri dati impostati su singole richieste non verranno inviati con altre richieste di sessione.

Conclusione

I concetti discussi in questo tutorial dovrebbero aiutarti a fare richieste di base a un server passando intestazioni, cookie o stringhe di query specifiche. Questo sarà molto utile quando stai cercando di carpire alcune pagine web per informazioni. Ora, dovresti anche essere in grado di scaricare automaticamente file musicali e sfondi da siti Web diversi dopo aver individuato un pattern negli URL.

Non esitate a vedere ciò che abbiamo a disposizione per la vendita e per studiare nel mercato, e non esitate a fare domande e fornire il vostro prezioso feedback utilizzando il feed qui sotto.

Se avete domande su questo tutorial, fatemelo sapere nei commenti.

Impara Python

Impara Python con la nostra guida completa al tutorial su Python, sia che tu stia appena iniziando o che sei un programmatore esperto che cerca di imparare nuove abilità.