Python网络通信(5) | 您所在的位置:网站首页 › python网络通讯 › Python网络通信(5) |
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中的各个组成部分进行分割,那么这时候就可以使用urlparse或urlsplit来进行分割。 # 创建一个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)运行,得到: urlparse和urlsplit基本上是一模一样的,唯一不同的地方是,urlparse里面多了一个params属性,而urlsplit没有这个params属性。 |
CopyRight 2018-2019 实验室设备网 版权所有 |