python3爬蟲之Urllib庫(一)


在python2里邊,用urllib庫和urllib2庫來實現請求的發送,但是在python3種在也不用那么麻煩了,因為只有一個庫了:Urllib.

urllib庫是python的標准庫,簡而言之就是不用自己安裝,使用時只需要import一下就好。

  urllib庫包含4個模塊:

    request: 最基本的HTTP請求模塊,用來發起請求,就和人們在瀏覽器上輸入網址來訪問網頁一樣。

    error:     異常處理模塊,如果在請求時出現錯誤,用這個模塊來抓住異常,保證程序不會因為拋出異常而掛掉。

    parse:    一個工具模塊,提供了許多URL處理方法,比如URL的拆分、合並等等。

    robotparser:主要用來識別目標網站的robot.txt文件(基本用不上)

  使用request模塊可以發送請求,主要有兩個方法: urlopen()    Request()

  urlopen()

  首先來舉個栗子:我們來使用urlopen方法來請求“筆趣閣”網站

  這是urllib()的API:

  urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)

from urllib import request

target_url = 'http://www.biquge9.com/'   
result = request.urlopen(target_url)    # 返回的response是類文件對象
print(result.read().decode('utf-8'))

  部分結果截圖(整個網頁內容太多放不下,我僅僅把網頁的頭部截了下來):

  是不是很強大?幾行代碼就可以扒下想要網頁源代碼,只要源碼在手,里邊的內容還不是想怎么拿怎么拿

  urllib庫的request模塊提供了最基本的用來構造HTTP請求的方法,整個請求過程已經完全封裝好了,我們只需要調用固定的方法,傳給相應的參數就可以發起請求了。

  下邊我們來分析一下剛剛那幾行代碼:

  from urllib import request    # 用來導入urllib庫的request模塊

  result = request.urlopen(target_url)    # 使用urlopen方法來請求網頁

  我們打印一下result的格式:

  <class 'http.client.HTTPResponse'> 這是一個HTTPOResponse類型的對象。這個對象我們是無法直接獲取網頁內容的,但是或者對象包含了許多方法與屬性:如 read()   readinto()    getheader(name)  getheaders()    fileno()   geturl()    info()    getcode() 等方法和msg    version    status    reason    debuglevel   closed等屬性,通過調用這些方法和屬性,我們就可以獲取到關於html頁面的信息。

  方法:

    (1)read()    調用read()方法就可以查看到網頁的源代碼了。但是得到的是bytes字節的類型。

       

  所以我們要用decode()將bytes進行解碼得到最終的html源代碼

  (2)getheaders()  獲取返回的rsponse Headers,是一個列表:

  

  這是我在瀏覽器種輸入網址 再按下F12,在控制台種看到的rsponse Header:

  

  (3)getheader('Server')  獲取rsponse Headers中的某一個參數

  

  (4)geturl()  獲取請求的目標頁面的url:

  

  (5)fileno()  以整數的形式返回文件描述符

  

  (6)info()   也是返回rsponse Headers種的內容,但並不是以列表的形式。

    

  (7)getcode()  獲取請求的響應碼,如200, 403,  404等待。

  

  屬性:

  status  這個屬性的作用和哪個getcode()方法一樣,都是返回響應碼

  

  msg    這個屬性用來判斷請求成不成功,成功的話會返回 “OK”

  

   reason 這個和那個msg一樣,也是在判定請求是否成功

  

 

  

  data參數 

  可選參數,當你在發起請求時想要傳遞數據,就可用它,

  但是數據需要使用bytes()方法將參數轉化為字節流編碼,且當傳遞參數后,請求方式就由get變成post了

  

  

  timeout參數

   用於設置超時時間,單位是秒,如果請求超出了設置時間還沒有響應,就會拋出異常,如果不指定參數,就是用全局默認時間,它支持HTTP、HTTPS、FTP請求。

   

  

  其他參數: 

  還有其他參數,如context參數, 他必須是ssl。SSLContext類型, 用來指定SSL設置。

  cafile和capath參數 用來指定CA證書和他的路徑。

 

  Request()

  雖然urllib可以發起請求,但是幾個簡單的參數並不能構建一個完整的請求,比如它就無法加入headers信息,所以才有的Request()

  

  我們同樣是使用urlopen()來發起請求,但是並不是直接請求url,而是請求一個Request對象,這樣可以將一個請求獨立封裝為一個對象,而且可以在這個請求對象中配置參數。

  這是Request()的構造方法:

  class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

  除了第一個url參數必傳,其他都是選傳參數

  第二個data參數,和urlopen()請求中的data參數一樣,必須穿bytes()類型,如果它是字典,就得先用urllib.parse模塊中的urlencode()編碼。

  第三個headers是一個字典,他就是請求頭,我們用來來傳入請求頭,可以在參數中直接傳,也可以利用add_header()方法進行添加。而請求頭中最重要的就是User-Agent和Cookies 這個咱們以后再說。

  第四個參數origin_req_host指的是請求方的HOST莫名稱或者IP地址。

  第五個unverifiable表示這個請求是否無法被驗證,默認為False

  第六個參數method表示請求方式, 如GET、POST、PUT等

好了,urllib庫的第一節就先到這兒,不然篇幅太長了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM