python3 urllib包与http包的使用

时间:2021-11-21 18:11:06

urllib包和http包都是面向HTTP协议的。其中urllib主要用于处理 URL,使用urllib操作URL可以像使用和打开本地文件一样地操作。而 http包则实现了对 HTTP协议的封装,是urllib.request模块的底层。


1.urllib包简介

2. http 包简介


1.urllib包简介

urllib包主要模块有:

1.urllib.request -----用于打开 URL网址;

2.urllib.error ---------定义了常见的urllib.request会引发的异常;

3.urllib.parse---------用于解析 URL;


具体方法:

urllib.request.urlopen( url,data,proxies )   :用于打开 url

参数如下:

   url:要进行操作的 URL地址

   data:可选项。向URL 传递的数据。

   proxies:可选项。使用的代理地址

import urllib.request

url = 'http://www.baidu.com'         #网页为百度首页
respone  = urllib.request.urlopen(url)   #打开url地址,并返回一个 HTTPRespone实例
html = respone.read().decode('utf-8')   #调用实例的 read()方法,并用 utf-8进行解码处理。就得出完整的百度的HTML文件
print(html)   
部分打印结果:

<html>
<head>
    
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
	<meta content="always" name="referrer">
    <meta name="theme-color" content="#2932e1">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
    <link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /> 
    <link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu.svg">


urllib.request.urlretrieve(url,filename,reporthook,data)   :用于将 URL的HTML文件下载并保存为本地文件

参数如下:

     url:要下载的网页

     filename:保存在主机的路径,可选项。

     reporthook:一个回调函数,可选项。

     data:发送的数据,一般用于 post,可选项。


特别:关于urlretrieve()的回调函数reporthook:可以用来显示下载的进度,几乎已经封装好

import urllib.request
def callbackfunc(blocknum, blocksize, totalsize):   #这三个参数是由 urlretrieve自动赋值的
    '''回调函数
    @blocknum: 已经下载的数据块
    @blocksize: 数据块的大小
    @totalsize: 远程文件的大小
    '''
    percent = 100.0 * blocknum * blocksize / totalsize
    if percent > 100:
        percent = 100
    print( "%.2f%%"% percent)   #保留两位小数

url = 'http://www.sina.com'

local = 'd:\\sina.html'                             #下载的html文件保存在 d盘的sina.html里
urllib.request.urlretrieve(url,local,callbackfunc)    #没下载完一个数据块,就会执行回调函数一次
执行结果:

//只显示局部
0.00%
1.38%
2.76%
4.13%
5.51%
6.89%


2. http包简介

http包提供了 HTTP协议的一些功能,主要模块有:

http.client   --- 底层的 HTTP 协议的一些功能,可以为 urllib.request 模块所用

http.server   --- 提供了基于 socketserver模块的基本 HTTP服务器类

http.cookies   --- cookies 的管理工具

http.client  :

HttpClient不是一个浏览器。它是一个客户端的HTTP通信实现库。HttpClient的目标是发送和接收HTTP报文。

两个主要类(用于客户端):

HTTPConnection   :基于HTTP协议的客户端,指定 URL(网址) 后,可以 发送请求报文 和 接收响应报文 

HTTPRespone       :基于 HTTP 协议的服务端回应。一旦用 HTTPConnection 成功连接,可以调用相关方法返回该实例(HTTPRequest实例)。


(1)HTTPConnection 的方法:

构造方法: HTTPConnection( host,port,[timeout] )  返回一个HTTPConnection 实例

host:表示主机域名或 ip 地址

port:表示端口

timeout:阻塞操作将会在给定时间后超时。可选项


发送请求报文方法:HTTPConnection.request( method,url,body =None,headers = {} )

method:发送的操作,一般为 GET 或者 POST

url         :进行操作的 url

body     :所发送的数据

headers:发送的 HTTP头部,是一个字典类型


获取响应报文方法:HTTPConnection.getrespone(  )

关闭与服务器的连接: HTTPConne.close()

发送一个头部:HTTPConnection.putheader( header,args[ ] )      #头部以一个字典方式发送

发送一个空白行到服务器,标志头部Header的结束:HTTPConnection.endheaders(  )

发送数据到服务器:HTTPConnection.send( data )       ,应该在endheaders()之后 和 getrespone()之前调用。



(2)HTTPRespone:

HTTPRespone对象:一旦用 HTTPConnection 成功连接,可以调用HTTPConnection.getrespone()返回该实例(HTTPRequest实例)。

HTTPRespone.getheader(name)  :返回头部中的 name 字段对应的值

HTTPRespone.getheaders( )       :以元组的方式返回整个头部的信息

HTTPRespone.read()                  :返回响应报文中的body部分,也即正文部分

HTTPRespone.status   #返回状态码

HTTPRespone.version  #返回 HTTP协议版本


http 包应用实例 。

from http.client import HTTPConnection

con = HTTPConnection('www.baidu.com',80)
con.request('GET','/')           #发送请求报文
res = con.getresponse()          #获取响应报文对象
print(res.status)   #200   (表示状态码)
print(res.reason)   #OK	  (表示状态码对应的意义)
print(res.read().decode('utf-8'))   #打印www.baidu.com的html