昨天我们看了一下urlib库的get请求功能,今天我们来看一下POST的请求。首先我们需要看一下一个post请求都有哪些内容。
首先我们找一个http的搜索引擎,我这边使用的www.mybu.net,访问这个网站后我们在搜索引擎上检索一个词,查看url的请求格式。如:
我们看到url格式中包含如下四个字段
代码语言:javascript复制search=python
submit.x=0
submit.y=0
mode=allwords
除了这个search字段为我们在输入框输入的内容外其它几个字段我也不清楚是什么意思,但是我们也不用管它。我们只需要了解字段类型就可以了。接下来我们就构造一个数据字典,并通过eulencode函数将其编码为url类型格式。
代码语言:javascript复制dict = {
'search':'python',
'submit.x':0,
'submit.y':0,
'mode':'allwords'
}
data = urllib.parse.urlencode(dict).encode('utf-8')
接下来我们还可以构造一个http请求headers头部,主要包含如下内容:
User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言。这个数据可以从 网页开发工具上的请求反应信息中获取(浏览器上一般按 F12 打开开发工具)。作用是用于伪装浏览器。
Referer:可以用来防止盗链,有一些网站图片显示来源 https://*.com ,就是检查 Referer 来鉴定的。
Connection:表示连接状态,记录 Session 的状态。
origin_req_host:请求方的 host 名称或者 IP 地址。
unverifiable:指请求无法验证,默认为 False。用户并没有足够的权限来选择接收这个请求结果,例如请求一个 HTML 文档中的图片,但没有自动抓取图像的权限,这时 unverifiable 为 True。
method:指定请求使用的方法,例如 GET、POST、PUT 等。
我就定义一个修改了浏览器类型和连接类型的头部,具体代码如下:
代码语言:javascript复制headers = {
'User-Agent':'Post_Multipart',
'Connection': 'keep-alive'
}
准备工作做好了之后,我们就将dict、headers和url整合成一个整体了。完整代码如下:
代码语言:javascript复制import urllib.request
import urllib.parse
url2 = ' http://www.mybu.net/search.asp'
headers = {
'User-Agent':'Post_Multipart',
'Connection': 'keep-alive'
}
dict = {
'search':'python',
'submit.x':0,
'submit.y':0,
'mode':'allwords'
}
data = urllib.parse.urlencode(dict).encode('utf-8')
req=urllib.request.Request(url=url,data=data,headers=headers)
f = urllib.request.urlopen(req)
print(f.geturl())
page = f.read()
print(page)
返回结果为:
从上面的例子可以看出,同样是urlopen函数,当我们的请求数据中携带data参数时,请求方式就是POST方式,当我们的请求数据中不携带data参数时,请求方式就是GET方式。