<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    11.5. 設置 User-Agent

    改善你的 HTTP web 服務客戶端的第一步就是用 User-Agent 適當地鑒別你自己。為了做到這一點,你需要遠離基本的 urllib 而深入到 urllib2

    例 11.4. urllib2 介紹

    >>> import httplib
    >>> httplib.HTTPConnection.debuglevel = 1                             1
    >>> import urllib2
    >>> request = urllib2.Request('http://diveintomark.org/xml/atom.xml') 2
    >>> opener = urllib2.build_opener()                                   3
    >>> feeddata = opener.open(request).read()                            4
    connect: (diveintomark.org, 80)
    send: '
    GET /xml/atom.xml HTTP/1.0
    Host: diveintomark.org
    User-agent: Python-urllib/2.1
    '
    reply: 'HTTP/1.1 200 OK\r\n'
    header: Date: Wed, 14 Apr 2004 23:23:12 GMT
    header: Server: Apache/2.0.49 (Debian GNU/Linux)
    header: Content-Type: application/atom+xml
    header: Last-Modified: Wed, 14 Apr 2004 22:14:38 GMT
    header: ETag: "e8284-68e0-4de30f80"
    header: Accept-Ranges: bytes
    header: Content-Length: 26848
    header: Connection: close
    
    1 如果你的 Python IDE 仍舊為上一節的例子而打開著,你可以略過這一步,在開啟 HTTP 調試時你能看到網絡線路上的實際傳輸過程。
    2 使用 urllib2 獲取 HTTP 資源包括三個處理步驟,這會有助于你理解這一過程。 第一步是創建 Request 對象,它接受一個你最終想要獲取資源的 URL。注意這一步實際上還不能獲取任何東西。
    3 第二步是創建一個 URL 開啟器 (opener)。它可以接受任何數量的處理器來控制響應的處理。但你也可以創建一個沒有任何自定義處理器的開啟器,在這兒你就是這么做的。你將在本章后面探究重定向的部分看到如何定義和使用自定義處理器的內容。
    4 最后一個步驟是,使用你創建的 Request 對象告訴開啟器打開 URL。因為你能從獲得的信息中看到所有調試信息,這個步驟實際上獲得了資源并且把返回數據存儲在了 feeddata 中。

    例 11.5. 給 Request 添加頭信息

    >>> request                                                1
    <urllib2.Request instance at 0x00250AA8>
    >>> request.get_full_url()
    http://diveintomark.org/xml/atom.xml
    >>> request.add_header('User-Agent',
    ...     'OpenAnything/1.0 +http://diveintopython.org/')    2
    >>> feeddata = opener.open(request).read()                 3
    connect: (diveintomark.org, 80)
    send: '
    GET /xml/atom.xml HTTP/1.0
    Host: diveintomark.org
    User-agent: OpenAnything/1.0 +http://diveintopython.org/   4
    '
    reply: 'HTTP/1.1 200 OK\r\n'
    header: Date: Wed, 14 Apr 2004 23:45:17 GMT
    header: Server: Apache/2.0.49 (Debian GNU/Linux)
    header: Content-Type: application/atom+xml
    header: Last-Modified: Wed, 14 Apr 2004 22:14:38 GMT
    header: ETag: "e8284-68e0-4de30f80"
    header: Accept-Ranges: bytes
    header: Content-Length: 26848
    header: Connection: close
    
    1 繼續前面的例子;你已經用你要訪問的 URL 創建了 Request
    2 使用Request 對象的 add_header 方法,你能向請求中添加任意的 HTTP 頭信息。第一個參數是頭信息,第二個參數是頭信息的值。User-Agent 的約定格式是:應用名,跟一個斜線,跟版本號。剩下的是自由的格式,你將看到許多瘋狂的變化,但通常這里應該包含你的應用的 URL。和你的請求的其他信息一樣,User-Agent 會被服務器紀錄下來,其中包含你的應用的 URL。如果發生錯誤,服務器管理員就能通過查看他們的訪問日志與你聯系。
    3 之前你創建的opener 對象也可以再生,且它將再次獲得相同的 feed,但這次使用了你自定義的 User-Agent 頭信息。
    4 這就是你發送的自定義的 User-Agent,代替了 Python 默認發送的一般的 User-Agent。若你繼續看,會注意到你定義的是 User-Agent 頭信息,但實際上發送的是 User-agent 頭信息。看看有何不同?urllib2 改變了大小寫所以只有首字母是大寫的。這沒問題,因為 HTTP 規定頭信息的字段名是大小寫無關的。
    97av