python之web模塊學習-- urllib

  準備寫一些列的 python之web模塊學習,基本上涉及經常使用的的web模塊,包括 urllib、urllib二、httplib、urlparse、requests,如今,開始咱們的第一個模塊的學習吧。html

  1  urllib簡介 python

    python urllib 模塊提供了一個從指定的URL地址獲取網頁數據,而後對其進行分析處理,獲取咱們想要的數據。web


  2  經常使用方法緩存

    2.1  urlopen  -- 建立一個類文件對象 爲讀取指定的URLbash

help(urllib.urlopen)

urlopen(url, data=None, proxies=None)
    Create a file-like object for the specified URL to read from.
參數:
    url :表示遠程數據的路徑,通常是http或者ftp路徑。
    data :表示以get或者post方式提交到url的數據。
    proxies :表示用於代理的設置。


Python 經過urlopen函數來獲取html數據,urlopen返回一個類文件對象,它提供了以下經常使用方法:
服務器

    1)read() , readline() , readlines(),fileno()和close():這些方法的使用與文件對象徹底同樣。
    2)info():返回一個httplib.HTTPMessage 對象,表示遠程服務器返回的頭信息。
    3)getcode():返回Http狀態碼,若是是http請求,200表示請求成功完成;404表示網址未找到。
    4)geturl():返回請求的url地址多線程

附代碼:ide

>>> import urllib
>>> response = urllib.urlopen('http://www.51cto.com') 
>>>res.read()
。。。。。。(一堆網頁代碼)
>>>res.readline()
'<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n' 
。。。。
>>>res.readlines()
。。。(list形式的一堆網頁代碼)
>>>res.info()
<httplib.HTTPMessage instance at0x1a02638>
>>> response.getcode()  # 返回Http狀態碼
    200
>>> response.geturl() # 返回請求的url地址 
    'http://www.51cto.com'
>>> response.close() # 最後別忘了關閉鏈接

    urllib中還提供了一些輔助方法,用於對url進行編碼、解碼。url中是不能出現一些特殊的符號的,有些符號有特殊的用途。咱們知道以get方式提交數據的時候,會在url中添加key=value這樣的字符串,因此在value中是不容許有'=',所以要對其進行編碼;與此同時服務器接收到這些參數的時候,要進行解碼,還原成原始的數據。這個時候,這些輔助方法會頗有用:
函數

    附帶的其餘方法:(主要是url編碼解碼)post

- urllib.quote(string[, safe]):對字符串進行編碼。參數safe指定了不須要編碼的字符
- urllib.unquote(string) :對字符串進行解碼
- urllib.quote_plus(string [ , safe ] ) :與urllib.quote相似,但這個方法用'+'來替換' ',而quote用'%20'來代替' '
- urllib.unquote_plus(string ) :對字符串進行解碼
- urllib.urlencode(query[, doseq]):將dict或者包含兩個元素的元組列表轉換成url參數。例如 字典{'name': 'wklken', 'pwd':'123'}將被轉換爲"name=wklken&pwd=123"  (經常使用)
#這裏能夠與urlopen結合以實現post方法和get方法
- urllib.pathname2url(path):將本地路徑轉換成url路徑
- urllib.url2pathname(path):將url路徑轉換成本地路徑

附代碼:

>>> import urllib
>>>res = urllib.quote('I am 51cto')
>>> res
'I%20am%2051cto'
>>>urllib.unquote(res)
'I am 51cto'
>>>res = urllib.quote_plus('I am 51cto')
>>> res
'I+am+51cto'
>>>urllib.unquote_plus(res)
'I am 51cto'
>>> params = {'name':'51cto','pwd':'51cto'}
>>>urllib.urlencode(params)
'pwd=51cto&name=51cto'
>>>l2u=urllib.pathname2url('E:\51cto')
'E%3A%29cto'
>>>urllib.url2pathname(l2u)
'E:)cto'

    2.2 urlretrieve -- 直接將遠程的數據下載到本地

help(urllib.urlretrieve)
urlretrieve(url, filename=None,reporthook=None, data=None)
參數:
    url :指定下載的URL
    finename :指定了保存本地路徑(若是參數未指定,urllib會生成一個臨時文件保存數據。
    reporthook :是一個回調函數,當鏈接上服務器、以及相應的數據塊傳輸完畢時會觸發該回調,咱們能夠利用這個回調函數來顯示當前的下載進度。
    data: 表示post到服務器的數據,該方法返回一個包含兩個元素的(filename,headers)元組,

    下面是一個 urlretrieve方法下載文件的實例,能夠顯示下載進度:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
import os

def schedule(a,b,c):
    ''' 回調函數
    @a:已經下載的數據
    @b:數據塊的大小
    @c:遠程文件的大小
    '''

    per = 100.0 * a * b / c
    if per > 100:
        per = 100
    print "%.2f%%" % per
url = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'
local = os.path.join('c:','Python-2.7.5.tar.bz2')
urllib.urlretrieve(url,local,schedule)

    2.3  urlcleanup -- 清除因爲urllib.urlretrieve()所產生的緩存


    經過上面的練習能夠知道,urlopen能夠輕鬆獲取遠端html頁面信息,而後經過python正則對所須要的數據進行分析,匹配出想要用的數據,而後利用urlretrieve將數據下載到本地。對於訪問受限或者對鏈接數有限制的遠程url地址能夠採用proxies(代理的方式)鏈接,若是遠程數據量過大,單線程下載太慢的話能夠採用多線程下載,這個就是傳說中的爬蟲。

    上面介紹的前兩個方法是urllib中最經常使用的方法,這些方法在獲取遠程數據的時候,內部會使用URLopener或者 FancyURLOpener類。做爲urllib的使用者,咱們不多會用到這兩個類。若是對urllib的實現感興趣,或者但願urllib支持更多的協議,能夠研究這兩個類。在Python手冊中,urllib的做者還列出了這個模塊的缺陷和不足,感興趣的能夠打開 Python手冊瞭解一下。

urllib :https://docs.python.org/2/library/urllib.html 

相關文章
相關標籤/搜索