前面我们已经讨论了模拟登陆中需要传送什么数据以及怎么找出传送的数据等等,在python 中,数据的传送有两种方式,POST和GET
POST 和 GET 是 HTTP 里面的两种请求方法,详细的介绍可以看这里:
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
这里结合python中的语法来简单的讲一下
POST方法
POST请求的数据是在HTTP的消息主体中发送的,这句话应该怎么理解呢?首先来看HTTP的消息
前面我们已经讲过了headers,这是请求头信息,它是HTTP消息的一部分,另外,还有请求行(Request Line)和消息体(Entity Body),这三个部分构成了完整的HTTP信息。
请求行(Request Line)
请求行由三个标记组成:请求方法、请求 URI 和 HTTP 版本,它们用空格分隔。
例如:GET /news.asp HTTP/1.1消息头(Message Headers)
由域名/值对组成,每行一对,域名和值之间用紧跟的英文冒号(“:”),单空格(SP)分开。消息头通知服务 器有关于客户端的功能和标识。如 Host: http://demo.com:80 表示请求的资源所在的主机和端口号,在 HTTP/1.1 协议中,Host 消息头是必选的。还可以有其他一些如 Accept-Charset、Accept-Encoding、Authorization 等等消息体(Entity Body)
HTTP 消息的消息体(如果存在),用于携带与请求相关联的数据,例如可以存一些请求需要的参数等。由消息头中的 Content-Length 或 Transfer-Encoding 来指示。消息头里的 Content-Type 说明了数据的传输类型
那么,在python中,怎么实现POST呢?
#!/uer/bin/env python
# -*- coding: UTF-8 -*-
__author__ = '217小月月坑'
'''
POST 传送数据
'''
import urllib # 要使用urlencode方法必须引入urllib模块
import urllib2
values = {"username":"xxxxxxxx@qq.com","password":"XXXX"}
# 将 POST的数据进行编码,编码完之后才可以发送
data = urllib.urlencode(values)
url = "http://www.baidu.com"
request = urllib2.Request(url)
response = urllib2.urlopen(request,data)
print response.read()
这依然是很简单的代码,我们来分析一下代码的流程
1. 将 post 数据写入字典
2. 使用 urllib.urlencode 对数据进行编码
3. 构造请求
4. 发送请求,获取返回值
其中有几个部分我们已经很熟悉了,这里主要讨论两个问题
1. 为什么要使用 urllib.urlencode 对数据进行编码
2. 怎么将数据发送出去
1. 为什么要使用 urllib.urlencode 对数据进行编码
还是老方法,使用 help 命令,这里就不截图了,来看看系统对这个函数的描述
urlencode(query, doseq=0)
Encode a sequence of two-element tuples or dictionary into a URL query string.
百度翻译过来是这样的:"将含有两个元素的元组或字典编码为URL查询字符串"
首先我们要弄清楚什么是 URL查询字符串
查询字符串是指URL请求中“问号”后面的部分。比如,http://www.baidu.com/?foo=bar 中问号后面的部分就是查询字符串,其中变量名是foo,值是bar,多个变量名和值用 & 连接
我们来测试看看经过编码之后的数据是怎样的,为了便于理解我这里使用了中文
#!/uer/bin/env python
# -*- coding: UTF-8 -*-
__author__ = '217小月月坑'
'''
测试 urllib.urlencode
'''
import urllib
values = {"username":"217小月月坑","password":"XXXX"}
data = urllib.urlencode(values)
print values
print data
输出如下:
{'username': '217\xe5\xb0\x8f\xe6\x9c\x88\xe6\x9c\x88\xe5\x9d\x91', 'password': 'XXXX'}
username=217%E5%B0%8F%E6%9C%88%E6%9C%88%E5%9D%91&password=XXXX
其实到了这里原因就很简单了,我们将数据发送的时候,可能会有中文或者是其他特殊的字符等等,这些字符是不符合url的编码格式的,所以为了便于操作,我们需要以一种方式将数据统一转码,就是 urllib.urlencode()
2. 发送 POST DATA 的几种方式
前面已经看过了,我们发送 data 的时候使用了 urlopen() 函数,那么既然是 data 这个参数,我们好像遇到过几回了,回想一下我们学习的函数和方法,urllib2.Request(),urllib2.urlopen(),opener 等等,只要是参数里面还有data的,都可以将data 发送出去
urllib2.Request(url,data)
urllib2.urlopen(url,data)
request.add_data(urllib.urlencode({"username":"xxxxxxxx@qq.com","password":"XXXX"}))
opener.open (url,data)
3. POST数据发送给谁
我们讲解了post的很多东西,也知道了怎么发送post,那么,post 的数据是发送给谁的呢?还记得前面我们说到的httpfox工具吗,它可以帮我们解决这个问题
红框部分就是post发送的数据的目标url,这是你登陆时候要发送的真正网址,只有把数据发送到这个网址上才可以,其他的网址都不行
2. GET方法
GET-从指定的资源请求数据,将数据加入到URL 中传送出去
这在python 中是怎么实现的呢?
#!/uer/bin/env python
# -*- coding: UTF-8 -*-
__author__ = '217小月月坑'
'''
GET 传送数据
'''
import urllib
import urllib2
values = {"username":"xxxxxxxx@qq.com","password":"XXXX"}
data = urllib.urlencode(values)
url = "http://www.baidu.com"
# 这个操作是将查询字符串加入url中,查询字符串是跟在 "?" 后面的,所以这里加上了一个 "?"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print geturl
print response.read()
为了便于理解我们将 GET 处理之后的url打印出来看看
http://www.baidu.com?username=xxxxxxxx%40qq.com&password=XXXX
好了,POST 和 GET 到这里就讲完了