Verwenden des Requests-Moduls in Python

Requests ist ein Python-Modul, mit dem Sie alle Arten von HTTP-Anforderungen senden können. Es ist eine benutzerfreundliche Bibliothek mit vielen Funktionen, die von der Übergabe von Parametern in URLs über das Senden von benutzerdefinierten Headern bis zur SSL-Überprüfung reichen. In diesem Lernprogramm erfahren Sie, wie Sie mit dieser Bibliothek einfache HTTP-Anforderungen in Python senden.

Sie können Requests mit Python Version 2.6-2.7 und 3.3-3.6 verwenden. Bevor Sie fortfahren, sollten Sie wissen, dass Requests ein externes Modul ist. Sie müssen es also zuerst installieren, bevor Sie die Beispiele in diesem Lernprogramm ausprobieren. Sie können es installieren, indem Sie den folgenden Befehl im Terminal ausführen:

Pip-Installationsanfragen

Nachdem Sie das Modul installiert haben, können Sie anhand des folgenden Befehls überprüfen, ob es erfolgreich installiert wurde:

Importanfragen

Wenn die Installation erfolgreich war, werden keine Fehlermeldungen angezeigt.

Eine GET-Anfrage stellen

Es ist sehr einfach, eine HTTP-Anfrage mit Requests zu senden. Sie beginnen mit dem Importieren des Moduls und stellen dann die Anforderung. Hier ist ein Beispiel:

Importanforderungen req = request.get ('https://tutsplus.com/')

Alle Informationen zu unserer Anfrage werden jetzt in einem aufgerufenen Response-Objekt gespeichert req. Zum Beispiel können Sie die Kodierung der Webseite mit der erforderliche Kodierung Eigentum. Sie können den Statuscode der Anfrage auch über das Symbol erhalten Anforderungsstatuscode Eigentum.

req.encoding # gibt 'utf-8' zurück req.status_code # gibt 200 zurück

Sie können auf die Cookies zugreifen, die der Server mit gesendet hat rec.cookies. In ähnlicher Weise können Sie die Antwortheader mit verwenden req.headers. Das req.headers Diese Eigenschaft gibt ein Wörterbuch zurück, bei dem zwischen Groß- und Kleinschreibung unterschieden wird. Das bedeutet, dass req.headers ['Content-Length']req.headers ['content-length'] und req.headers ['INHALTSLÄNGE'] geben alle den Wert von zurück 'Inhaltslänge' Antwortheader.

Sie können prüfen, ob es sich bei der Antwort um eine wohlgeformte HTTP-Umleitung handelt, die möglicherweise automatisch mit der Option verarbeitet wurde req.is_redirect Eigentum. Es wird wiederkommen Wahr oder Falsch basierend auf der Antwort. Sie können auch die Zeit zwischen dem Senden der Anfrage und dem Zurücksenden einer Antwort über das Symbol abrufen entfällt Eigentum.

Die URL, die Sie ursprünglich an den übergeben haben erhalten() Die Funktion kann sich aus einer Reihe von Gründen, einschließlich Weiterleitungen, von der endgültigen URL der Antwort unterscheiden. Um die endgültige Antwort-URL anzuzeigen, können Sie die verwenden req.url Eigentum.

Importanforderungen req = request.get ('http://www.tutsplus.com/') req.encoding # gibt 'utf-8' zurück req.status_code # gibt 200 req.elapsed # gibt datetime.timedelta (0, 1, 666890) req.url # gibt 'https://tutsplus.com/' zurück. Req.history # liefert [, ] req.headers ['Content-Type'] # gibt 'text / html zurück; Zeichensatz = utf-8 ' 

Es ist schön, all diese Informationen über die Webseite zu erhalten, auf die Sie zugreifen, aber Sie möchten höchstwahrscheinlich auf den eigentlichen Inhalt zugreifen. Wenn der Inhalt, auf den Sie zugreifen, Text ist, können Sie das verwenden req.text Eigenschaft, um darauf zuzugreifen. Der Inhalt wird dann als Unicode analysiert. Sie können die Kodierung, mit der der Text dekodiert werden soll, mit der erforderliche Kodierung Eigentum.

Bei Nicht-Textantworten können Sie mit binär auf diese zugreifen erforderlichen Gehalt. Das Modul wird automatisch decodiert gzip und entleeren Übertragungskodierungen. Dies kann hilfreich sein, wenn Sie mit Mediendateien arbeiten. In ähnlicher Weise können Sie auf den json-codierten Inhalt der Antwort (sofern vorhanden) mit zugreifen req.json ().

Sie können die rohe Antwort auch vom Server erhalten req.raw. Denken Sie daran, dass Sie passieren müssen Stream = wahr in der Anfrage, die rohe Antwort zu erhalten.

Einige Dateien, die Sie mit dem Anforderungsmodul aus dem Internet herunterladen, sind möglicherweise sehr groß. In solchen Fällen ist es nicht ratsam, die gesamte Antwort oder Datei auf einmal in den Speicher zu laden. Sie können eine Datei in Teilen oder Brocken mit dem herunterladen iter_content (chunk_size = 1, decode_unicode = False) Methode. 

Diese Methode durchläuft die Antwortdaten in chunk_size Anzahl Bytes gleichzeitig. Wann Stream = wahr Wurde für die Anforderung festgelegt, verhindert diese Methode, dass bei großen Antworten die gesamte Datei auf einmal in den Speicher geschrieben wird. Das chunk_size Parameter kann entweder eine ganze Zahl oder sein Keiner. Wenn auf einen ganzzahligen Wert gesetzt, chunk_size bestimmt die Anzahl der Bytes, die in den Speicher eingelesen werden sollen.

Wann chunk_size ist eingestellt auf Keiner und Strom ist eingestellt auf Wahr, Die Daten werden gelesen, sobald sie in der empfangenen Größe empfangen werden. Wann chunk_size ist eingestellt auf Keiner und Strom ist eingestellt auf Falsch, Alle Daten werden als einzelner Block zurückgegeben.

Laden Sie dieses Bild eines Waldes auf Pixabay mit dem Requests-Modul herunter. Hier ist das eigentliche Bild:

Dies ist der Code, den Sie benötigen:

Importanforderungen req = request.get ('path / to / forest.jpg', stream = True) req.raise_for_status () mit open ('Forest.jpg', 'wb') als fd: für chunk in req.iter_content ( chunk_size = 50000): print ('Received a Chunk') fd.write (chunk)

Das "Pfad / nach / forest.jpg" ist die tatsächliche Bild-URL; Sie können die URL eines anderen Bildes hier eingeben, um etwas anderes herunterzuladen. Die angegebene Bilddatei hat eine Größe von 185kb, und Sie haben festgelegt chunk_size bis 50.000 Bytes. Dies bedeutet, dass die Meldung "Received a Chunk" viermal im Terminal gedruckt werden sollte. Die Größe des letzten Blocks beträgt nur 39350 Bytes, da der Teil der Datei, der nach den ersten drei Iterationen noch empfangen werden muss, 39350 Bytes beträgt.

Mit Anfragen können Sie auch Parameter in einer URL übergeben. Dies kann hilfreich sein, wenn Sie eine Webseite nach bestimmten Ergebnissen durchsuchen, z. B. nach einem bestimmten Bild oder einem bestimmten Tutorial. Sie können diese Abfragezeichenfolgen als Wörterbuch mit Zeichenfolgen bereitstellen Params Schlüsselwort in der GET-Anforderung. Hier ist ein Beispiel:

Importanforderungen query = 'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600' req = request.get ('https: // pixabay. com / de / photos / ', params = query) req.url # gibt' https://pixabay.com/de/photos/?order=popular&min_height=600&q=Forest&min_width=800 'zurück.

Eine POST-Anfrage stellen

Das Erstellen einer POST-Anforderung ist genauso einfach wie das Erstellen von GET-Anforderungen. Sie benutzen einfach die Post() Funktion statt erhalten(). Dies kann nützlich sein, wenn Sie automatisch Formulare übermitteln. Mit dem folgenden Code wird beispielsweise die gesamte Wikipedia-Seite zu Nanotechnologie heruntergeladen und auf Ihrem PC gespeichert.

Importanforderungen req = request.post ('https://en.wikipedia.org/w/index.php', data = 'search': 'Nanotechnology') req.raise_for_status () mit open ('Nanotechnology.html ',' wb ') als fd: für chunk in req.iter_content (chunk_size = 50000): fd.write (chunk)

Senden von Cookies und Kopfzeilen

Wie bereits erwähnt, können Sie auf die Cookies und Header zugreifen, die der Server mit Ihnen zurücksendet rec.cookies und req.headers. Mit Anfragen können Sie auch Ihre eigenen benutzerdefinierten Cookies und Header mit einer Anfrage senden. Dies kann hilfreich sein, wenn Sie beispielsweise einen benutzerdefinierten Benutzeragenten für Ihre Anfrage festlegen möchten.

Wenn Sie einer Anfrage HTTP-Header hinzufügen möchten, können Sie diese einfach an a übergeben Dikt zum Überschriften Parameter. Ebenso können Sie Ihre eigenen Cookies mit einem Server an einen Server senden Dikt an den übergeben Kekse Parameter.

Importanforderungen url = 'http://some-domain.com/set/cookies/headers' headers = 'user-agent': 'your-own-user-agent / 0.0.1' cookies = 'visit- month ':' February ' req = request.get (URL, Header = Header, Cookies = Cookies) 

Cookies können auch in einer Keksdose übergeben werden. Sie bieten eine umfassendere Benutzeroberfläche, mit der Sie diese Cookies über mehrere Pfade verwenden können. Hier ist ein Beispiel:

Importanfragen jar = request.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 = request.get (url, cookies = jar) req.text # gibt' "cookies" zurück: "first_cookie": "first", "second_cookie": "third" '

Sitzungsobjekte

Manchmal ist es nützlich, bestimmte Parameter für mehrere Anforderungen beizubehalten. Das Session-Objekt macht genau das. Beispielsweise werden Cookie-Daten für alle Anforderungen gespeichert, die in derselben Sitzung ausgeführt werden. Das Session-Objekt verwendet das Verbindungspooling von urllib3. Dies bedeutet, dass die zugrunde liegende TCP-Verbindung für alle Anforderungen an denselben Host erneut verwendet wird. Dies kann die Leistung erheblich steigern. Sie können auch Methoden des Requests-Objekts mit dem Session-Objekt verwenden.

Hier ist ein Beispiel für mehrere Anforderungen, die mit und ohne Verwendung von Sitzungen gesendet werden:

Importanforderungen reqOne = request.get ('https://tutsplus.com/') reqOne.cookies ['_ tuts_session'] #returns 'cc118d94a84f0ea37c64f14dd868a175' reqTwo = request.get ('https://code.tutsplus.com/tutorials 'reqTwo'cookies' 'tuts_session'] #returns '3775e1f1d7f3448e25881dfc35b8a69a' ssnOne = Anfragen.Session () 'ssnOne.get (' https://tutsplus.com/ ') ssnOne.cookies [' _tuts_tutsplus.com/ ') ssnOne.cookies reqThree = ssnOne.get ('https://code.tutsplus.com/tutorials') reqThree.cookies ['_ tuts_session'] #returns '4c3dd2f41d2362108fbb191448eab3b4' 

Wie Sie sehen, hat das Session-Cookie einen anderen Wert in der ersten und zweiten Anforderung, aber es hat denselben Wert, wenn wir das Session-Objekt verwendet haben. Wenn Sie diesen Code ausprobieren, erhalten Sie einen anderen Wert, aber auch in Ihrem Fall hat das Cookie für die Anforderungen, die mit dem Sitzungsobjekt gemacht wurden, denselben Wert.

Sitzungen sind auch hilfreich, wenn Sie über alle Anforderungen hinweg dieselben Daten senden möchten. Wenn Sie beispielsweise entscheiden, ein Cookie oder einen User-Agent-Header mit allen Anforderungen an eine bestimmte Domäne zu senden, können Sie Sitzungsobjekte verwenden. Hier ist ein Beispiel:

Importanforderungen ssn = request.Session () ssn.cookies.update ('visit-month': 'February') reqOne = ssn.get ('http://httpbin.org/cookies') print (reqOne.text.) ) # gibt Informationen über das Cookie "visit-month" aus. reqTwo = ssn.get ('http://httpbin.org/cookies', cookies = 'visit-year': '2017') print (reqTwo.text) # gibt Informationen über das Cookie "visit-month" und "visit-year" aus. reqThree = ssn.get ('http://httpbin.org/cookies') print (reqThree.text) # gibt Informationen über das Cookie "visit-month" aus 

Wie Sie sehen können, die "Besuchsmonat" Sitzungs-Cookie wird mit allen drei Anforderungen gesendet. Jedoch die "Besuchsjahr" Cookie wird nur während der zweiten Anfrage gesendet. Es gibt keine Erwähnung des "vist-year" Cookie auch in der dritten Anfrage. Dies bestätigt die Tatsache, dass Cookies oder andere Daten, die auf individuellen Anforderungen festgelegt wurden, nicht mit anderen Sitzungsanfragen gesendet werden.

Fazit

Die in diesem Lernprogramm behandelten Konzepte sollten Ihnen dabei helfen, grundlegende Anforderungen an einen Server zu stellen, indem Sie bestimmte Header, Cookies oder Abfragezeichenfolgen übergeben. Dies ist sehr praktisch, wenn Sie versuchen, einige Webseiten nach Informationen zu durchsuchen. Jetzt sollten Sie auch Musikdateien und Hintergrundbilder automatisch von verschiedenen Websites herunterladen können, sobald Sie ein Muster in den URLs gefunden haben.

Zögern Sie nicht zu sehen, was wir für den Verkauf und zum Lernen auf dem Markt zur Verfügung haben, und zögern Sie nicht, Fragen zu stellen und mit dem untenstehenden Feed wertvolles Feedback zu geben.

Wenn Sie Fragen zu diesem Tutorial haben, teilen Sie mir dies bitte in den Kommentaren mit.

Lerne Python

Lernen Sie Python mit unserem kompletten Python-Tutorial, egal ob Sie gerade erst anfangen oder ein erfahrener Programmierer sind, der neue Fähigkeiten erlernen möchte.