post请求
Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对。
发送POST请求时,需要特别注意headers的一些属性:
-
Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个。
-
Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。
-
X-Requested-With: XMLHttpRequest :表示Ajax异步请求。
发送post请求
import urllib.parse as parse
import ssl
#https://httpbin.org/post为自带的测试url,可以返回我们发送到服务器的相关参数
url = 'https://httpbin.org/post'
#发起post请求要构造表单数据
from_data = {
'name':'某某某',
'password':'xxxx12345',
'age':18,
'sex':1,
}
#post请求在给服务器传参数的时候,
# 1.首先要使用urlencode编码
# 2.最后传的参数一定是一个字节类型的
#1.首先要使用urlencode编码
from_data = parse.urlencode(from_data)
#2.最后传的参数一定是一个字节类型的
from_data = from_data.encode('utf-8')
print(from_data)
print(type(from_data))
request = urllib.request.Request(url, data = from_data)
response = urllib.request.urlopen(request)
print (response.read())
案例1有道词典翻译
有道词典翻译网站: 其中有一条是POST请求,而向服务器发送的请求数据并不是在url里,那么我们可以试着模拟这个POST请求。
post请求给服务器传参数
import urllib.request as request
import urllib.parse as parse
# POST请求的目标URL(这个代码是之前的链接,方便我们使用,不用传递sign参数,新版中该参数是加密的)
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
headers = {
'User_Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0',
}
formdata = {
'i': '你好',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION',
'typoResult': 'false',
}
data = parse.urlencode(formdata).encode('utf-8')
req = request.Request(url, data = data, headers = headers)
response = request.urlopen(req)
print (response.read().decode('utf-8'))
实战案例2豆瓣电影post请求
import urllib.request as request
import urllib.parse as parse
url = 'https://www.douban.com/accounts/login'
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Referer':'https://www.douban.com/',
}
fromdata = {
'source':'index_nav',
'form_email':'18518753265',
'form_password':'ljh123456',
'captcha-solution':'throat',
'captcha-id':'b1FwAHMeu3L3PNIJU7GYTDcm:en',
'user_login':'登录',
}
fromdata = parse.urlencode(fromdata).encode('utf-8')
print(fromdata)
req = request.Request(url=url,data=fromdata,headers=headers)
response = request.urlopen(req)
print(response.status)
print(response.read().decode('utf-8'))
小总结:
-
GET方式是直接以链接形式访问,链接中包含了所有的参数,服务器端用Request.QueryString获取变量的值。如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。
-
POST则不会在网址上显示所有的参数,服务器端用Request.Form获取提交的数据,在Form提交的时候。但是HTML代码里如果不指定 method 属性,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。
处理HTTPS请求 SSL证书验证
现在随处可见 https 开头的网站,urllib可以为 HTTPS 请求验证SSL证书,就像web浏览器一样,如果网站的SSL证书是经过CA认证的,则能够正常访问,如:https://www.baidu.com/等...
如果SSL证书验证不通过,或者操作系统不信任服务器的安全证书,比如浏览器在访问12306网站如:https://www.12306.cn/mormhweb/的时候,会警告用户证书不受信任。 (据说 12306 网站证书是自己做的,没有通过CA认证)

urllib在访问的时候则会报出SSLError:
import urllib.request as request
url = "https://www.12306.cn/mormhweb/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
req = request.Request(url, headers = headers)
response = request.urlopen(req)
print (response.read())
运行结果:
ssl.CertificateError:......
所以,如果以后遇到这种网站,我们需要单独处理SSL设置,忽略未认证的CA证书,让程序忽略SSL证书验证错误,即可正常访问。
import urllib
# 1\. 导入Python SSL处理模块
import ssl
# 2\. 表示忽略未经核实的SSL证书认证
context = ssl._create_unverified_context()
url = "https://www.12306.cn/mormhweb/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
request = urllib.request.Request(url, headers = headers)
# 3\. 在urlopen()方法里 指明添加 context 参数
response = urllib.request.urlopen(request, context = context)
print (response.read().decode())
关于CA
CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的受信任的第三方机构,如北京数字认证股份有限公司、上海市数字证书认证中心有限公司等...
CA的作用是检查证书持有者身份的合法性,并签发证书,以防证书被伪造或篡改,以及对证书和密钥进行管理。
现实生活中可以用身份证来证明身份, 那么在网络世界里,数字证书就是身份证。和现实生活不同的是,并不是每个上网的用户都有数字证书的,往往只有当一个人需要证明自己的身份的时候才需要用到数字证书。
普通用户一般是不需要,因为网站并不关心是谁访问了网站,现在的网站只关心流量。但是反过来,网站就需要证明自己的身份了。
比如说现在钓鱼网站很多的,比如你想访问的是www.baidu.com,但其实你访问的是www.daibu.com”,所以在提交自己的隐私信息之前需要验证一下网站的身份,要求网站出示数字证书。
一般正常的网站都会主动出示自己的数字证书,来确保客户端和网站服务器之间的通信数据是加密安全的。
网友评论