Python網路程式設計中urllib2模組的用法總結

WBOY
發布: 2016-08-04 08:55:49
原創
1130 人瀏覽過

一、最基礎的應用

import urllib2

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

print html

登入後複製

客戶端與伺服器端透過request與response來溝通,客戶端先傳送request,再接收服務端傳回的response

urllib2提供了request的類,可以讓使用者在發送請求前先建構一個request的對象,然後透過urllib2.urlopen方法來發送請求

import urllib2

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

登入後複製

上例先使用

req = urllib2.Request(url)
登入後複製

實例化一個resquest對象,接下來使用

urllib2.urlopen(req)
登入後複製

來開啟這個網頁。

我們注意到在實例化Request物件的時候,隊了url是必須的,還有幾個預設的參數

2016712152259943.png (864×76)

基中data與header也是使用的比較多的,一些需要登入的才能瀏覽的網站經常需要這兩個參數

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

登入後複製

這個例子是向百度發送幾個數據,這個例子是會返回一個錯誤頁面,很正常,因為我們在訪問百度的時候並不需要post什麼信息,post了倒是會出錯

百度是找不到對應的網頁就會報錯。

當然這個是POST數據,也可以用在GET方法,稍將上面的程式碼進行改造

百度是透過http://www.baidu.com/s?wd=XXX 來查詢的,這樣我們需要將{‘wd':'xxx'}這個字典進行urlencode

#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

登入後複製

以下以模擬登入人人網然後再顯示首頁內容為例來詳細說明一下cookie的使用,以下是文件中給的例子,我們就透過改造這個例子來實現我們想要的功能

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

登入後複製

當你看到有cj的時候,說明你已經訪問了登錄頁面,是否正常登錄你現在還看不出來,可以通過訪問http://www.renren.com/home 來查看

上面的程式碼有兩點要說明,我也是看了很久才明白

r = opener.open(url,data) 
登入後複製

這句話,為什麼要使用opener這個物件來open,而不是用utllib2,urlopen?不光是例子裡這麼寫,我們才這麼寫,透過改造我們也可以使用urllib2.urlopen,其實是因為opener是urllib2.bulid_opener創造出來的, 但是你可以這樣理解,他build出來後,自已卻並沒有安裝使用它,也沒有它的屬性與方法,如果想使urllib2也具有opener的屬性與方法,可以先使用urllib2.install_opener( opener)來"安裝"這個opener,安裝完以後就可以使用urllib2來操作了

#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

登入後複製

同樣urllib2還有proxy相關的handle,基本的思路和這個差不多。

二、異常處理

當urlopen()無法處理回應時會造成URLError異常。 HTTPError異常是URLError的子類,只有在存取HTTP類型的URL時才會引起。

1、URLError異常

通常引起URLError的原因是:無網路連線(沒有到目標伺服器的路由)、存取的目標伺服器不存在。在這種情況下,異常物件會有reason屬性(是一個(錯誤碼、錯誤原因)的元組)。

#! /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

登入後複製

2、HTTPError
每一個從伺服器回傳的HTTP回應都有一個狀態碼。其中,有的狀態碼表示伺服器不能完成對應的請求,預設的處理程序可以為我們處理一些這樣的狀態碼(如傳回的回應是重定向,urllib2會自動為我們從重定向後的頁面中取得資訊) 。有些狀態碼,urllib2模組不能幫我們處理,那麼urlopen函數就會造成HTTPError異常,其中典型的有404/401。
HTTPError異常的實例有整數類型的code屬性,表示伺服器傳回的錯誤狀態碼。
urllib2模組預設的處理程序可以處理重定向(狀態碼是300範圍),而且狀態碼在100-299範圍內表示成功。因此,能夠引起HTTPError異常的狀態碼範圍為:400-599.
當造成錯誤時,伺服器會傳回HTTP錯誤碼和錯誤頁面。你可以將HTPError實例當作傳回頁面,這意味著,HTTPError實例不僅有code屬性,還有read、geturl、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()

登入後複製

3、總結
如果想在程式碼中處理URLError和HTTPError有兩種方法,程式碼如下:

#! /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 #其他异常的处理
登入後複製

相比較而言,第二種異常處理方法較優。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!