天天看點

urllib urllib2學習筆記

Python的urllib和urllib2子產品都做與請求URL相關的操作,但他們提供不同的功能。他們兩個最顯着的差異如下:

  •   urllib2可以接受一個Request對象,并以此可以來設定一個URL的headers,但是urllib隻接收一個URL。這意味着,你不能僞裝你的使用者代理字元串等。
  •   urllib子產品可以提供進行urlencode的方法,該方法用于GET查詢字元串的生成,urllib2的不具有這樣的功能。這就是urllib與urllib2經常在一起使用的原因。

urllib

1、urllib.urlopen(url, data=None, proxies=None, context=None)方法

打開一個url的方法,傳回一個對象,可以類似檔案對象的操作來讀取資料

import urllib

f = urllib.urlopen("https://www.cnblogs.com/")
print f.readline()

#<!DOCTYPE html>      

urlopen傳回對象提供方法:

-         read() , readline() ,readlines() , fileno() , close() :這些方法的使用方式與檔案對象完全一樣

-         info():傳回一個httplib.HTTPMessage對象,表示遠端伺服器傳回的頭資訊

-         getcode():傳回Http狀态碼。如果是http請求,200請求成功完成;404網址未找到

-         geturl():傳回請求的url

2、urllib.urlretrieve(url, filename=None, reporthook=None, data=None, context=None)方法

urlretrieve方法将url定位到的html檔案下載下傳到你本地的硬碟中。如果不指定filename,則會存為臨時檔案。

urlretrieve()傳回一個二進制組(filename,httplib.HTTPMessage)

f = urllib.urlretrieve("https://www.cnblogs.com/")
print f

('d:\\temp\\tmp7_mted', <httplib.HTTPMessage instance at 0x01B8F030>)      

第一個元素是儲存的檔案路徑,第二個元素是httplib.HTTPMessage對象,跟urlopen.info()方法一樣,儲存的是遠端伺服器傳回的頭資訊。

指定儲存的檔案

f = urllib.urlretrieve("https://www.cnblogs.com/", filename='cnblog.html')
print f

('cnblog.html', <httplib.HTTPMessage instance at 0x01D8B030>)      

3、urllib.urlcleanup()

清除由于urllib.urlretrieve()所産生的緩存

4、urllib.quote(str)

對或取的資料進行編碼,進而符合URI協定,使其能被web伺服器接受。

f1 = urllib.quote("https://www.cnblogs.com/", safe='/')
print f1
#https%3A//www.cnblogs.com/      

safe可以指定不需要編碼的字元,可以以字元串的形式設定,例:safe=‘:/’,這樣将不會對:/進行編碼,預設不對 / 編碼

5、urllib.quote_plus(str)

此函數是對請求中的url拼接的參數中的空格替換為+,這個我們很常見到,送出帶空格的參數時,将看到空格都變成了+

f2 = urllib.quote_plus(' ', safe='/')
print f2

+      

也看到有safe吧,學習了quote,可能會想到這個也是個安全字元設定,對設定的字元不做編碼??

是的,quote_plus這個其實實在quote上做了拓展,檢視源碼就知道了

def quote_plus(s, safe=''):
    """Quote the query fragment of a URL; replacing ' ' with '+'"""
    if ' ' in s:
        s = quote(s, safe + ' ')
        return s.replace(' ', '+')
    return quote(s, safe)      

其實調用了quote()方法,safe這個是給quote用的,預設是不對空格做編碼的。

有編碼,那就肯定有解碼了,解碼方法對應的是:urllib.unquote(str)、urllib.unquote_plus(str)

6、urllib.urlencode()

将URL中的鍵值對以連接配接符&劃分,并把空格編碼為+

查詢參數

data = {'name': 'aa bb', 'lover':'ccc'}
params = urllib.urlencode(data)
print params
#name=aa+bb&lover=ccc
f = urllib.urlopen('https://www.cnblogs.com?{}'.format(params))      

urlencode方法會調用quote_plus,把空格編碼為+

請求體中參數

data = {'name': 'aa bb', 'lover':'ccc'}
params = urllib.urlencode(data)
print params
#name=aa+bb&lover=ccc
f = urllib.urlopen('https://www.cnblogs.com/', date=params)      

urllib2

1、urllib2.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,cafile=None, capath=None, cadefault=False, context=None)

跟urllib差不多,也是傳回一個對象,次對象操作方式跟檔案對象類似

f2 = urllib2.urlopen("https://www.cnblogs.com/")
html = f2.read()
print html      

2、urllib2.Request(url, data=None, headers={},origin_req_host=None, unverifiable=False)

urllib2可以建立個request對象,構造一個完成的request對象,資料、請求頭資訊等都可以做設定

data = {'name': 'aa bb', 'lover':'ccc'}
params = urllib.urlencode(data)
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; … Gecko/20100101 Firefox/54.0'}
req = urllib2.Request("https://www.cnblogs.com/",data=params, headers=headers)
req.add_data(urllib.urlencode({'age': 100, 'like': 'h'}))#重新設定送出的參數,會覆寫之前設定的 
req.add_header('Host', '127.0.0.1')#添加請求頭資訊 
print req.headers 
print req.data 
response = urllib2.urlopen(req) 
print response.readline()      

繼續閱讀