Heim > Backend-Entwicklung > Python-Tutorial > Zusammenfassung der Verwendung des Moduls urllib2 in der Python-Netzwerkprogrammierung

Zusammenfassung der Verwendung des Moduls urllib2 in der Python-Netzwerkprogrammierung

WBOY
Freigeben: 2016-08-04 08:55:49
Original
1155 Leute haben es durchsucht

1. Die einfachste Anwendung

import urllib2

url = r'http://www.baidu.com'
html = urllib2.urlopen(url).read()

print html

Nach dem Login kopieren

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

Nach dem Login kopieren

Im obigen Beispiel verwenden Sie zuerst

req = urllib2.Request(url)
Nach dem Login kopieren

Instanziieren Sie ein Anforderungsobjekt und verwenden Sie dann

urllib2.urlopen(req)
Nach dem Login kopieren

um diese Seite zu öffnen.

Wir haben festgestellt, dass beim Instanziieren des Request-Objekts die URL festgelegt werden muss und es mehrere Standardparameter gibt

2016712152259943.png (864×76)

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

Nach dem Login kopieren

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_page

Nach dem Login kopieren

Das 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 cj

Nach dem Login kopieren
Wenn 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

Warum sollten wir in diesem Satz das Opener-Objekt zum Öffnen verwenden, anstatt utllib2 und urlopen zu verwenden? Wir können es auch so schreiben. Durch Transformation können wir es auch so schreiben. urlopen. Tatsächlich liegt es daran, dass opener urllib2 ist. Es wurde von .bulid_opener erstellt, aber Sie können es so verstehen, dass Sie es nicht installiert und verwendet haben und auch nicht über seine Attribute und Methoden verfügen Wenn Sie möchten, dass urllib2 auch über die Attribute und Methoden von opener verfügt, können Sie zuerst install_opener (opener) verwenden, um den Opener zu „installieren“. Nach der Installation können Sie ihn mit urllib2 bedienen
r = opener.open(url,data) 
Nach dem Login kopieren

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 html

Nach dem Login kopieren

2. 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-Ausnahme

Normalerweise 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).

2. HTTP-Fehler
#! /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.reason

Nach dem Login kopieren

Jede 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.




3. Zusammenfassung
#! /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()

Nach dem Login kopieren

Wenn Sie URLError und HTTPError im Code behandeln möchten, gibt es zwei Methoden. Der Code lautet wie folgt:


Im Vergleich dazu ist die zweite Ausnahmebehandlungsmethode besser.
#! /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 #其他异常的处理
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage