python-47: 传送数据的两种方法

前面咱们已经讨论了模拟登录中须要传送什么数据以及怎么找出传送的数据等等,在python 中,数据的传送有两种方式,POST和GEThtml

POST 和 GET 是 HTTP 里面的两种请求方法,详细的介绍能够看这里:python

http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
函数

这里结合python中的语法来简单的讲一下工具

  1. POST方法
    post

        POST请求的数据是在HTTP的消息主体中发送的,这句话应该怎么理解呢?首先来看HTTP的消息学习

        前面咱们已经讲过了headers,这是请求头信息,它是HTTP消息的一部分,另外,还有请求行(Request Line)和消息体(Entity Body),这三个部分构成了完整的HTTP信息。测试

  1. 请求行(Request Line)
    请求行由三个标记组成:请求方法、请求 URI 和 HTTP 版本,它们用空格分隔。
    例如:GET /news.asp HTTP/1.1编码

  2. 消息头(Message Headers)
    由域名/值对组成,每行一对,域名和值之间用紧跟的英文冒号(“:”),单空格(SP)分开。消息头通知服务     器有关于客户端的功能和标识。如 Host: http://demo.com:80 表示请求的资源所在的主机和端口号,在 HTTP/1.1 协议中,Host 消息头是必选的。还能够有其余一些如 Accept-Charset、Accept-Encoding、Authorization 等等url

  3. 消息体(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 发送出去

  1. urllib2.Request(url,data)

  2. urllib2.urlopen(url,data)

  3. request.add_data(urllib.urlencode({"username":"xxxxxxxx@qq.com","password":"XXXX"}))

  4. 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 到这里就讲完了

相关文章
相关标签/搜索