Python网络通信(5)— HTTP通信之urllib库

Python网络通信(5)— HTTP通信之urllib库

一、urllib库介绍

urllib库是python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
在python3的urllib库中,所有和网络请求相关的方法,都被集成到urllib.request模块下面了。

二、urllib.request 模块里的函数

首先从urllib库里导入request模块

from urllib import request
1. urlopen函数:

第一个参数url : 及我们要请求的url。
第二个参数data : post提交的数据,如果设置了这个值,那么将变成post请求。
还有其他参数。。。
返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。
例如,我们使用urlopen函数访问百度,

# 向百度发送get请求
resp = request.urlopen("http://www.baidu.com")

然后使用getcode()可以得到返回的响应状态码

# 打印返回的状态码
print(resp.getcode())

可以看到返回200,请求正常。服务器正常的返回数据。在这里插入图片描述
然后使用read(size)、readline()、readlines()可以读取到返回的body信息,即我们看到的HTML网页的源码

   # 打印body消息,即HTML网页的源码
   print(resp.read().decode('utf-8'))

运行程序,得到:
在这里插入图片描述
在浏览器访问查看源码,可以看到代码是一样的,(不过这里要注意,如果你在浏览器登录了百度账号,那么代码肯定是不一样的)
在这里插入图片描述

2、urlretrieve函数

这个函数可以将网页上的文件保存到本地,例如将百度首页下载下来,第一个函数是百度首页的url,第二个参数是存储在本地的文件名,可以带路径;

    # 下载百度首页,文件名为 baidu.html
    request.urlretrieve("http://www.baidu.com","baidu.html")

运行程序,然后在python脚本同目录下可以看到我们得到的文件
在这里插入图片描述
用浏览器打开,可以看到,这就是百度的首页
在这里插入图片描述
另外,我们将百度首页的这个图片下载下来,右键,复制图片地址,
在这里插入图片描述
然后使用urlretrieve下载

    # 下载百度首页的一张图片,文件名为 baidu.png
    request.urlretrieve("https://www.baidu.com/img/pc_2e4ef5c71eaa9e3a3ed7fa3a388ec733.png", "baidu.png")

运行程序,然后在python脚本同目录下可以看到我们得到的文件
在这里插入图片描述

3、Request类

如果需要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。
如下,模拟chrome浏览器访问百度首页:

    # User-Agent设置为chrome浏览器的名称
    header = {
        'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
    }
    # 实例化一个Request对象,将请求头中的User-Agent设置为chrome浏览器的名称
    req = request.Request("http://www.baidu.com",headers=header)
    # 通过Request对象访问网站
    resp = request.urlopen(req)
    print(resp.read().decode('utf-8'))

可以参考博客:https://blog.csdn.net/ckk727/article/details/102239141

三、urllib.parse 模块里的函数

urllib.parse模块定义了url的标准接口,实现url的各种抽取,url的解析,合并,编码,解码。
首先,从urllib库里导入parse 模块

1、urlencode函数

用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动的进行编码,这时候就应该使用urlencode函数来实现。urlencode可以把字典数据转换为URL编码的数据。

    # 创建一个字典
    data = {'name':"william",'word':"你好,世界",'age':"20岁"}
    # 使用urlencode编码
    qs = parse.urlencode(data)
    print(qs)

运行程序,可以看到:
在这里插入图片描述
列如,我们在百度搜索刘德华,
在这里插入图片描述
将其URL复制下来,可以看到:

https://www.baidu.com/s?wd=%E5%88%98%E5%BE%B7%E5%8D%8E

然后我们使用python来合成这个

	url = "https://www.baidu.com/s"
    params = {'wd':"刘德华"}
    qs = parse.urlencode(params)
    url = url + '?' + qs
    print(url)

运行,可以看到,得到的编码是一样的
在这里插入图片描述

2、parse_qs函数

相应的,有编码就有解码函数,parse_qs()函数可以将进过编码后的url参数进行解码:

    # 创建一个字典
    data = {'name': "william", 'word': "你好,世界", 'age': "20岁"}
    # 使用urlencode编码
    qs = parse.urlencode(data)
    print(qs)
    # 解码
    par_data = parse.parse_qs(qs)
    print(par_data)

运行结果如下所示:
在这里插入图片描述

3、urlparse和urlsplit函数

有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparseurlsplit来进行分割。

    # 创建一个url
    url = "http://www.baidu.com/s;hello?wd=python&username=william#2"
    # 使用urlparse解码
    result1 = parse.urlparse(url)
    print("urlparse:",result1)
    # 使用urlsplit解码
    result2 = parse.urlsplit(url)
    print("urlsplit:",result2)

运行,得到:
在这里插入图片描述
urlparseurlsplit基本上是一模一样的,唯一不同的地方是,urlparse里面多了一个params属性,而urlsplit没有这个params属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值