我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

上一篇文章里面,苏南大叔使用了requests 模块去做相关get或者post请求。在本文中,将使用urllib模块来做类似的请求,思路基本上一致,就是写法不同罢了。但是,值得特别说明的是:本文使用的模块是:urllib,并不是urllib2,也不是urllib3

苏南大叔:python代码,如何利用urllib模块发出get或者post请求? - urllib-get-post
python代码,如何利用urllib模块发出get或者post请求?(图3-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述urlib模块,如何处理最常见的get或者post请求。测试环境:win10python@3.6.8urllib

基本需求

使用flask部署了非常简单的api服务,具体可以参考文章:

可以使用requests模块,实现和本文一样的需求,可以参考文章:

准备数据

import urllib
import urllib.request
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
    'Cookie': 'JSESSIONID=C87094F7F00867BA60ADBCE0473720B0'
}
_data = b"id=3&name=%E8%8B%8F%E5%8D%97" # 这种不能定义中文
_data = {'id': '3','name':"苏南"}
_data = urllib.parse.urlencode(_data).encode('utf-8')

urllib.request必须单独import,否则会报错:

AttributeError: module 'urllib' has no attribute 'request'

在测试中,无论是get还是post,都要发送参数id。所以,这里对这个数据做了提前准备。值得说明的是:在urllib这个模块里面,参数需要是byte类型,常见的dict或者str是不识别的。

定义一个byte类型,可以:

  • 使用一个字母b于字符串前面,强制转化,但是这种不能定义中文,会报错。
  • 如果想定义中文,【推荐】使用urllib.parse.urlencode().encode()来做转化。

post请求

对于urllib来说,postget的区别,就仅仅是是否传递data参数。所以,只要传递了data参数,就是post方法。测试代码如下:

_url = "http://127.0.0.1:8888/_post"
__request = urllib.request.Request(_url, headers=headers, data=_data)
_response = urllib.request.urlopen(__request)
_text = str(_response.read().decode("utf-8")).strip()
print(_text)

获得返回值如下:

{"msg": "post用户苏南id为3", "header": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}

GET请求

urllib这个模块里面,get的参数必须在url里面发送,也就是说必须拼接url的字符串。测试代码如下:

_url = "http://127.0.0.1:8888/_get"
_url = _url +"?" + str(_data,"utf-8")
# _response = urllib.request.urlopen(_url)
__request = urllib.request.Request(_url, headers=headers)
_response = urllib.request.urlopen(__request)
_text = str(_response.read().decode("utf-8")).strip()
print(_text)

返回值类似如下:

{"msg": "get用户苏南id为3", "header": "JSESSIONID=C87094F7F00867BA60ADBCE0473720B0"}

苏南大叔:python代码,如何利用urllib模块发出get或者post请求? - get请求
python代码,如何利用urllib模块发出get或者post请求?(图3-2)

直接保存文件

相对于requests模块,urllib模块里面的保存文件功能,就简单的多。测试代码如下:

_url = "https://newsn.net/usr/themes/panda/assets/img/logo_multi.png"
urllib.request.urlretrieve(_url, filename="abc.png")

这个函数用起来比较简单,但是有个问题就是:无法自定义传递header信息,暂时无解。有知道的小伙伴请留言。

getpost的临界点

函数都是urllib.request.Request(url, headers, data, method)

  • databytes类型,而且传递data之后,默认的get就会变成post
  • 如果再使用method='get'强制转换的话,post请求可以变成get

苏南大叔:python代码,如何利用urllib模块发出get或者post请求? - get对比post
python代码,如何利用urllib模块发出get或者post请求?(图3-3)

函数urllib.request.urlopen():

  • 如果直接传递个url的话,可以正常使用,但是无法传递headers
  • 如果想传递headers的话,就要把这个参数包装成request类型。

相关文章

综述

本文从urllib定义get或者post方法的区别上来看,这个urllib库确实有些局限性,不符合现在多样化的数据请求方式方法的实际情况。所以,urllib的使用场景是有局限的。更多python相关经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python