Python3爬蟲(三)請求庫的使用之urllib


 Infi-chu:

http://www.cnblogs.com/Infi-chu/

 

一、urllib庫:

1. 是Python內置的HTTP請求庫

2. 在Python2中,由urllib和urllib2之分,而在Python3中,統一為urllib

3. 主要包含模塊:

  request:最基本的發送模塊,用來模擬發送請求

  error:異常處理模塊

  parse:一個工具模塊

  robotparser:主要用來識別robots.txt文件

 

二、發送請求:

1. urlopen()

  urllib.request:模塊提供了最基本的構造HTTP請求的方法,同時還帶有處理驗證(authentication)、重定向(redirection)、瀏覽器Cookies等

import urllib.request
r = urllib.request.openurl('http://www.baidu.com')
print(r.read().decode('utf-8'))
print(type(r))    # <class 'http.client.HTTPResponse'>

  HTTPResponse類型的對象包括的方法:read()、readinto()、getheader(name)、getheaders()、fileno()等

  HTTPResponse類型的對象包括的屬性:msg、version、status、reason、debuglevel、closed等

  urlopen()函數的API:  

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

    data參數:

      1. 可選

      2. 若是字節流編碼格式的內容,即bytes類型,則需要通過bytes()方法轉化。若傳遞該參數,則請求方式會有GET變為POST

      3. bytes()第一個參數需為str類型,可用urllib.parse.urlencode()方法是字典變為字符串

    timeout參數:

      1. 可選

      2. 用於設置超時時間,單位是秒,默認使用全局默認時間

      3. 支持HTTP、HTTPS、FTP請求

      4. 例:   

import urllib
try:
    r = urllib.request.urlopen('http://www.baidu.com',timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('Time Out!')

    context參數:必須是ssl.SSLContext類型,用來指定SSL設置

    cafile參數:指定CA證書

    capath參數:指定CA證書的路徑

    【注】cafile和capath一起在請求HTTPS時使用

    cadefault參數:已被廢棄,默認是False

    

2. Request

  urlopen()不足以構建一個完整的請求,若要加入Headers等信息,就可以用Request類

  Request類的構造:  

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

    url參數:同urlopen()

    data參數:同urlopen()

    headers參數:

      1. 請求頭

      2. 可以直接在字典中構造,也可以用add_header()方法添加

      3. 可將User-Agent改為Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)  【注】偽造成瀏覽器訪問

    origin_req_host參數:指的是請求方的host名稱或IP地址

    unverifiable參數:請求是否是無法驗證的,默認是False

    method參數:是一個字符串,用來指示請求的方法

3. Handler(請求的高級用法):

  Handler是各種處理器,可以處理登錄驗證,可以處理Cookies,可以處理代理。

  urllib.request模塊里面的BaseHandler類,是所有其他Handler的父類。

  各種Handler子類繼承這個BaseHandler類:

    HTTPDefaultErrorHandler:用於處理HTTP響應錯誤,會拋出異常

    HTTPRedirectHandler:用於處理重定向

    HTTPCookieProcessor:用於處理Cookies

    ProxyHandler:用於設置代理,默認為空

    HTTPPasswordMgr:用於管理密碼

    HTTPBasicAuthHandler:用於管理認證

4. OpenDirector:

  應用:驗證、代理、Cookies

 

 

三、異常處理:

1. URLError:

  a. 來自urllib庫的error模塊,他繼承自OSError類,是error異常模塊的基類,由request模塊產生的異常都可以通過它處理

  b. reason屬性,返回原因

2. HTTPError:

  a. 是URLError的子類,專門用來處理HTTP請求錯誤

  b. 三個屬性:

    code:返回狀態碼

    reason:返回原因

    headers:返回請求頭

 

四、解析鏈接:

  介紹parse模塊中的方法,parse定義了處理URL的標准接口

1. urlparse()

  實現URL的識別分段。

  API用法: 

urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)

  urlstring參數:必選,待解析的URL

  scheme參數:它是默認的協議(HTTP、HTTPS),urlstring沒有時生效

  allow_fragments參數:是否忽略fragment,False為忽略,當URL中不包含params和query時,fragment會被解析為path的一部分

2. urlunparse()

  與urlparse對立,接受的參數是一個可迭代對象,長度必須為6(scheme,netloc,path,params,query,fragment),可以是元組、字典等特定的數據結構,這樣就可以實現URL的構造

3. urlsplit()

  與urlparse相似,不單獨解析parse,返回5各部分,元組類型

4. urlunsplit()

  與urlunparse()類似,將各個部分拼接,長度必須是5

5. urljoin()

  生成鏈接,提供一個base-url的scheme,netloc,和path 3個內容並對新鏈接缺失的部分進行補充。

  【注】兩個都有取最新的,不全的話互補

6. urlencode()

  在構造GET請求參數的時候很有用,將字典序列化為GET請求參數

7. parse_qs()

  反序列化,將一串GET請求參數,轉化為字典

8. parse_qsl()

  同parse_qs(),將GET轉化為元組組成的列表

9. quote()

  將內容轉化為URL編碼的格式,因為URL有中文編碼格式時,可能會出現亂碼,用它可以轉化

10. unquote()

  進行URL解碼

 

五、分析robots協議:

  robotparser模塊,該模塊提供了一個RobotFileParser類

urllib.robotparser.RobotFileParser(url='')

  此類的常用方法:

  set_url()  設置robots.txt文件的鏈接

  read()  讀取文件並分析

  parse()  解析文件

  can_fetch()  傳入兩個參數,第一個是User-Agent,第二個是抓取的URL,返回是否可抓取

  mtime()  返回上回抓取和分析的時間

  modified()  將當前時間設置為上次抓取和分析的時間


免責聲明!

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



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