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 到這裏就講完了

相關文章
相關標籤/搜索