美文网首页
Urllib库的使用四---POST方法,CA证书

Urllib库的使用四---POST方法,CA证书

作者: IT的咸鱼 | 来源:发表于2018-10-17 18:41 被阅读0次

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认证)

12306zhengshu

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”,所以在提交自己的隐私信息之前需要验证一下网站的身份,要求网站出示数字证书。

一般正常的网站都会主动出示自己的数字证书,来确保客户端和网站服务器之间的通信数据是加密安全的。

相关文章

网友评论

      本文标题:Urllib库的使用四---POST方法,CA证书

      本文链接:https://www.haomeiwen.com/subject/lxerzftx.html