Python爬蟲學習(2): httplib

Amei1314發表於2016-10-17

  httplib模組實現了HTTP和HTTPS的客戶端部分,但是一般不直接使用,經常通過urllib來進行HTTP,HTTPS的相關操作。

  如果需要檢視其原始碼可以通過查詢命令定位:

find / -name "httplib.py"

  整個請求過程的狀態轉移圖如下所示:

  

httplib提供如下的類:

1. httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])

  一個HTTPConnection例項表示一次與HTTP server的連機事務,在例項化的時候至少需要一個主機地址。port引數如果沒有指定會預設採用80埠。strict引數的預設值是false,當這個值為true的時候,如果狀態行(status line)不是HTTP/1.0 or 1.1,則會引發BadStatusLine錯誤。timeout引數指定在多長時間後還未連線到主機則停止此聯機行為。source_address引數是二元組形式(host,port),指定發起連線的客戶機的IP和埠。

>>> h1 = httplib.HTTPConnection('www.cwi.nl')
>>> h2 = httplib.HTTPConnection('www.cwi.nl:80')
>>> h3 = httplib.HTTPConnection('www.cwi.nl', 80)
>>> h3 = httplib.HTTPConnection('www.cwi.nl', 80, timeout=10)

  其包含如下幾個方法:

  1.1 HTTPConnection.request(method, url[, body[, headers]])

    以method方法來訪問url地址,body引數可以是需要傳送的資料字串,還可以是檔案物件,其將會在傳送完headers之後傳送出去。headers引數對應HTTP headers中需要的內容。如果headers引數沒有指定,則headers中的Content-Length會根據body的大小自動新增(字串的長度或者是檔案的大小)。

  1.2 HTTPConnection.getresponse()

    一般在呼叫request之後用來獲取返回結果,此方法返回一個HTTPResponse物件。

    注意: 在傳送一個新的請求之前要先讀取返回的結果,否則會出錯。原始檔中對應的部分如下:

        # Note: if a prior response exists, then we *can* start a new request.

        #       We are not allowed to begin fetching the response to this new

        #       request, however, until that prior response is complete.

        #

        if self.__state == _CS_IDLE:

            self.__state = _CS_REQ_STARTED

        else:

            raise CannotSendRequest()

 

    測試例項:

 

    

  1.3 HTTPConnection.set_debuglevel(level)

    設定除錯級別(相關的除錯資訊會列印出來),預設值是0,表示不列印除錯資訊。

In [14]: con = httplib.HTTPConnection("www.baidu.com")

In [15]: con.set_debuglevel(1)
# 請求過程中會輸出一些調式資訊
In [16]: req = con.request("GET","/")
send: 'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nAccept-Encoding: identity\r\n\r\n'

 

 

  1.4 HTTPConnection.connect()

    當HTTPConnection物件建立的時候自動連線到伺服器

  1.5 HTTPConnection.close()

    你懂的

  你除了直接呼叫request()方法來訪問伺服器,還可以以下邊4步實現此功能:

  1.6.1 HTTPConnection.putrequest(request, selector[, skip_host[, skip_accept_encoding]])

     這是連線到伺服器之後的第一步操作

  1.6.2 HTTPConnection.putheader(header, argument[, ...])

     傳送請求頭

  1.6.3 HTTPConnection.endheaders(message_body=None)

    向伺服器傳送一空行表示請求頭的結束。

  1.6.4 HTTPConnection.send(data) 

    向伺服器傳送資料。應該在endheaders函式呼叫之後,getresponse函式之前呼叫。

2. httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address[, context]]]]]]])

  這是HTTPConnection的一個子類,通過SSL來和安全主機互動,採用的預設埠是443.如果引數context指定時候,這其此引數必須是ssl.SSLContext(描述SSL的各種資訊)的例項。

  key_file和cert_file引數已經棄用。

3. httplib.HTTPResponse(sock, debuglevel=0, strict=0)

  這個類會在成功連線後返回,不會被使用者直接初始化。

  HTTPResponse.read([amt])

    返回響應結果,或者讀取下amt個位元組

In [23]: response = con.getresponse()

In [24]: response.read(10)
Out[24]: '<!DOCTYPE '

 

 

  HTTPResponse.getheader(name[, default])

    獲取指定檔案頭中指定的內容

 

In [26]: response.getheader("server")
Out[26]: 'BWS/1.1'
In [27]: response.getheader("date")
Out[27]: 'Mon, 17 Oct 2016 10:59:40 GMT'
In [28]: response.getheader("Date")
Out[28]: 'Mon, 17 Oct 2016 10:59:40 GMT'

 

 

  HTTPResponse.getheaders()

    獲取檔案頭的列表

    

  HTTPResponse.fileno()

    獲取socket的檔案描述符

  HTTPResponse.msg

獲取包含響應頭的 mimetools.Message 的例項

In [30]: message = response.msg
In [31]: message
Out[31]: <httplib.HTTPMessage instance at 0x39610e0>
# 獲取響應頭資訊
In [
33]: dict = message.dict In [34]: dict Out[34]: {'accept-ranges': 'bytes', 'cache-control': 'no-cache', 'connection': 'Keep-Alive', 'content-length': '14613', 'content-type': 'text/html', 'date': 'Mon, 17 Oct 2016 10:59:40 GMT', 'last-modified': 'Thu, 13 Oct 2016 05:07:00 GMT', 'p3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'pragma': 'no-cache', 'server': 'BWS/1.1', 'set-cookie': 'BAIDUID=6C2B1FF908F1DD87C092C282D6F1EE2A:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=6C2B1FF908F1DD87C092C282D6F1EE2A; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1476701980; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'vary': 'Accept-Encoding', 'x-ua-compatible': 'IE=Edge,chrome=1'}

 

  HTTPResponse.status

   HTTP的狀態碼

  HTTPResponse.reason

In [35]: response.reason
Out[35]: 'OK'

 

 

 

4. httplib.HTTPMessage

   這個類中儲存HTTP的響應頭資訊。其通過 mimetools.Message實現,並提供處理頭的使用函式,不會被使用者例項化。

 

 

 

 

 

 

 

 

 

 

 

 

參考地址: https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection

相關文章