Heim >Backend-Entwicklung >Python-Tutorial >Zusammenfassung der Verwendung des Moduls urllib2 in der Python-Netzwerkprogrammierung
1. Die einfachste Anwendung
import urllib2 url = r'http://www.baidu.com' html = urllib2.urlopen(url).read() print html
Der Client und der Server kommunizieren über Anfrage und Antwort. Der Client sendet zuerst eine Anfrage an den Server und empfängt dann die vom Server zurückgegebene Antwort
urllib2 stellt die Anforderungsklasse bereit, die es Benutzern ermöglicht, vor dem Senden einer Anforderung ein Anforderungsobjekt zu erstellen und die Anforderung dann über die Methode urllib2.urlopen zu senden
import urllib2 url = r'http://www.baidu.com' req = urllib2.Request(url) html = urllib2.urlopen(req).read() print html
Im obigen Beispiel verwenden Sie zuerst
req = urllib2.Request(url)
Instanziieren Sie ein Anforderungsobjekt und verwenden Sie dann
urllib2.urlopen(req)
um diese Seite zu öffnen.
Wir haben festgestellt, dass beim Instanziieren des Request-Objekts die URL festgelegt werden muss und es mehrere Standardparameter gibt
Daten und Header werden häufig auch in der Basis verwendet. Einige Websites, die zum Durchsuchen eine Anmeldung erfordern, erfordern häufig diese beiden Parameter
import urllib import urllib2 url = 'http://www.baidu.com/' values = {'name' : 'Michael Foord', 'location' : 'Northampton','language' : 'Python' } data = urllib.urlencode(values) req = urllib2.Request(url,data) response = urllib2.urlopen(req) the_page = response.read() print the_page
In diesem Beispiel werden einige Daten an Baidu gesendet. Dies ist normal, da wir beim Besuch von Baidu keine Informationen veröffentlichen müssen. Wenn wir diese jedoch veröffentlichen, tritt ein Fehler auf
Baidu meldet einen Fehler, wenn die entsprechende Webseite nicht gefunden werden kann.
Natürlich handelt es sich hierbei um POST-Daten. Sie können auch in der GET-Methode verwendet werden. Ändern Sie den obigen Code leicht
Baidu-Abfragen erfolgen über http://www.baidu.com/s?wd=XXX, daher müssen wir das Wörterbuch {'wd':'xxx' urlencodieren🎜>
#coding:utf-8 import urllib import urllib2 url = 'http://www.baidu.com/s' values = {'wd':'杨彦星'} data = urllib.urlencode(values) print data url2 = url+'?'+data response = urllib2.urlopen(url2) the_page = response.read() print the_pageDas Folgende ist ein Beispiel für die Simulation der Anmeldung bei Renren und die anschließende Anzeige des Homepage-Inhalts, um die Verwendung von Cookies im Detail zu erläutern. Das Folgende ist ein Beispiel im Dokument. Wir werden dieses Beispiel umwandeln, um die gewünschten Funktionen zu erreichen 🎜>
import cookielib, urllib2 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) r = opener.open("http://example.com/") #coding:utf-8 import urllib2,urllib import cookielib url = r'http://www.renren.com/ajaxLogin' #创建一个cj的cookie的容器 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #将要POST出去的数据进行编码 data = urllib.urlencode({"email":email,"password":pass}) r = opener.open(url,data) print cjWenn Sie cj sehen, bedeutet dies, dass Sie die Anmeldeseite besucht haben. Sie können nicht erkennen, ob Sie sich normal angemeldet haben. Sie können dies überprüfen, indem Sie http://www.renren.com/home besuchen Im obigen Code müssen zwei Punkte erklärt werden, und es hat lange gedauert, bis ich sie verstanden habe
r = opener.open(url,data)
In ähnlicher Weise verfügt auch urllib2 über Proxy-bezogene Handles. Die Grundidee ist ähnlich.
#coding:utf-8 import urllib2,urllib import cookielib url = r'http://www.renren.com/ajaxLogin' #创建一个cj的cookie的容器 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) #将要POST出去的数据进行编码 data = urllib.urlencode({"email":email,"password":pass}) #r = opener.open(url,data)如果没有上面的urllib2.install_opener方法,就必须这样写了 r = urllib2.urlopen(url,data) html = urllib2.urlopen('http://www.renren.com/home').read() print html2. Ausnahmebehandlung
URLError-Ausnahme wird ausgelöst, wenn urlopen() die Antwort nicht verarbeiten kann. Die HTTPError-Ausnahme ist eine Unterklasse von URLError und wird nur beim Zugriff auf eine URL vom Typ HTTP ausgelöst.
1. URLError-AusnahmeNormalerweise sind die Ursachen für URLError: keine Netzwerkverbindung (keine Route zum Zielserver) und der Zielserver, auf den zugegriffen wird, existiert nicht. In diesem Fall verfügt das Ausnahmeobjekt über ein Grundattribut (das ein Tupel aus (Fehlercode, Fehlergrund) ist).
#! /usr/bin/env python #coding=utf-8 import urllib2 url="http://www.baidu.com/" try: response=urllib2.urlopen(url) except urllib2.URLError,e: print e.reasonJede vom Server zurückgegebene HTTP-Antwort hat einen Statuscode. Darunter weisen einige Statuscodes darauf hin, dass der Server die entsprechende Anfrage nicht abschließen kann. Der Standardhandler kann einige dieser Statuscodes für uns verarbeiten (wenn die zurückgegebene Antwort eine Umleitung ist, ruft urllib2 automatisch Informationen von der umgeleiteten Seite ab). Es gibt einige Statuscodes, die das Modul urllib2 nicht für uns verarbeiten kann, sodass die Funktion urlopen eine HTTPError-Ausnahme verursacht, die typisch für 404/401 ist.
Instanzen von HTTPError-Ausnahmen verfügen über ein Codeattribut vom Typ Integer, das den vom Server zurückgegebenen Fehlerstatuscode darstellt.
Der Standardhandler des urllib2-Moduls kann Weiterleitungen verarbeiten (Statuscode liegt im Bereich 300), und Statuscodes im Bereich 100–299 zeigen Erfolg an. Daher ist der Statuscodebereich, der HTTPError-Ausnahmen verursachen kann, 400-599.
Wenn ein Fehler auftritt, gibt der Server einen HTTP-Fehlercode und eine Fehlerseite zurück. Sie können die HTTPError-Instanz als Rückgabeseite verwenden, was bedeutet, dass die HTTPError-Instanz nicht nur über das Code-Attribut verfügt, sondern auch über Methoden wie read, geturl und info.
#! /usr/bin/env python #coding=utf-8 import urllib2 url="http://cs.scu.edu.cn/~duanlei" try: response=urllib2.urlopen(url) except urllib2.HTTPError,e: print e.code print e.read()Wenn Sie URLError und HTTPError im Code behandeln möchten, gibt es zwei Methoden. Der Code lautet wie folgt:
#! /usr/bin/env python #coding=utf-8 import urllib2 url="xxxxxx" #需要访问的URL try: response=urllib2.urlopen(url) except urllib2.HTTPError,e: #HTTPError必须排在URLError的前面 print "The server couldn't fulfill the request" print "Error code:",e.code print "Return content:",e.read() except urllib2.URLError,e: print "Failed to reach the server" print "The reason:",e.reason else: #something you should do pass #其他异常的处理 #! /usr/bin/env python #coding=utf-8 import urllib2 url="http://xxx" #需要访问的URL try: response=urllib2.urlopen(url) except urllib2.URLError,e: if hasattr(e,"reason"): print "Failed to reach the server" print "The reason:",e.reason elif hasattr(e,"code"): print "The server couldn't fulfill the request" print "Error code:",e.code print "Return content:",e.read() else: pass #其他异常的处理