python代码,如何利用urllib模块发出get或者post请求?
发布于 作者:苏南大叔 来源:程序如此灵动~上一篇文章里面,苏南大叔使用了requests
模块去做相关get
或者post
请求。在本文中,将使用urllib
模块来做类似的请求,思路基本上一致,就是写法不同罢了。但是,值得特别说明的是:本文使用的模块是:urllib
,并不是urllib2
,也不是urllib3
。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述urlib
模块,如何处理最常见的get
或者post
请求。测试环境:win10
,python@3.6.8
,urllib
。
基本需求
使用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
来说,post
和get
的区别,就仅仅是是否传递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"}
直接保存文件
相对于requests
模块,urllib
模块里面的保存文件功能,就简单的多。测试代码如下:
_url = "https://newsn.net/usr/themes/panda/assets/img/logo_multi.png"
urllib.request.urlretrieve(_url, filename="abc.png")
这个函数用起来比较简单,但是有个问题就是:无法自定义传递header
信息,暂时无解。有知道的小伙伴请留言。
get
和post
的临界点
函数都是urllib.request.Request(url, headers, data, method)
:
data
是bytes
类型,而且传递data
之后,默认的get
就会变成post
。- 如果再使用
method='get'
强制转换的话,post
请求可以变成get
。
函数urllib.request.urlopen()
:
- 如果直接传递个
url
的话,可以正常使用,但是无法传递headers
。 - 如果想传递
headers
的话,就要把这个参数包装成request
类型。
相关文章
综述
本文从urllib
定义get
或者post
方法的区别上来看,这个urllib
库确实有些局限性,不符合现在多样化的数据请求方式方法的实际情况。所以,urllib
的使用场景是有局限的。更多python
相关经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。