Python 中的POST/GET包構建以及隨機字符串的生成。Python 初級應用


POST/GET 包是神馬東西呢。

首先先介紹一下當我們在瀏覽器中鍵入URL后, 瀏覽器中到底發生了什么吧。

根據原來的知識,我們可以知道,如果計算機和服務器要通訊的話,必須知道服務器准確的IP地址,那我們的URL中一般是不會存在IP地址的,而是域名,類似於facebook.com 當我們鍵入facebook.com 並回車后,瀏覽器會先在瀏覽器緩存中尋找facebook.com 所對應的IP地址,如果緩存沒有,瀏覽器將請求系統緩存,如果系統緩存中也沒有,那么系統發起對ISP服務商的DNS服務器的解析請求,如果沒有,那么將向更上層的域名服務器發起請求。這個過程,叫做域名解析。當然國內facebook.com可以被正確解析,但是沒法訪問,這歸功於偉大的GFW。

下面我們用baidu.com舉例吧。

image

第二行后面就跟着baidu.com所對應的服務器的ip地址。

之后,瀏覽器會向服務器發送一個GET請求,讓我們用HTTPanalyzer攔截一個。

Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: ***********************************

可以從字面意思得到,我們給服務器發送個各種本機的信息,其中包括瀏覽器內核,可接受的網頁格式,壓縮格式,語言,語言編碼,以及Cookies。

Cookies 是身份驗證的重要組件。

而當我們填寫網頁上面的的表格時,瀏覽器會向服務器發送POST數據包,較之GET包,除了Request Header , 還有BODY部分,來存放表單的內容,其內容可能被加密或者壓縮。


現在,我們來用Python,創建GET包和POST包。

至於有什么用處,大家慢慢體會。

Python 中包含了大量的庫,作為一門新興的語言,Python 對HTTP有足夠強大的支持。

現在,我們引入新的庫 httplib 以及 urllib

這兩個庫根據名稱,我們可以知道他們是對於HTTP以及URL的操作。

讓我們直入主題,HOW to Build a post or get

首先我們先要與服務器建立連接。(我們以某微博作為例子實現下文的各種功能)

conn = httplib.HTTPConnection("ti50*****com");

只要沒有提示錯誤,我們就可以認為連接已成功,下面就可以進行數據包發送了。

在上文中我們說過了GET包的結構,只有HEARDER 部分。而在httplib中,heaer 是通過一個字典來保存的。下面我們來定義它:

headers = {"Content-Type": "application/x-www-form-urlencoded",
   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
   "Referer": "http://ti50.*****com/g/s?sid=*********************",
   "Accept-Encoding": "",
   "Accept-Language": "zh-CN,zh;q=0.8",
   "Accept-Charset": "GBK,utf-8;q=0.7,*;q=0.3",
   "Cookie": Cookie  }

Accept-Encoding 我們刪除了其內容,這對於服務器來說我們客戶端不能接受任何壓縮的格式,數據包將用原始數據發送回來,這樣我們就可以省去解壓縮的過程直接分析網頁了,但是這樣做的后果是流量大,網絡實時性差。關於解壓縮自然有別的庫來專門處理。

然后我們可以直接發送了。

conn.request(method="GET",url='''http://ti50****com/g/s?*********_TK9EH&r=''' + go_num + '''&aid=amsg&bid=******=true&ifh=1&ngpd=false''',headers=headers);

method 字段說明是發送何種類型的數據包。

url 字段以字符串的形式定義地址

header 字段定義包頭。

一般來說,一個數據包發送至服務器,服務器會相應的返回一個應答包。而且這個應答包對於我們往往是有用的,我們用下面的命令獲取應答包。

response = conn.getresponse();

對於上面這條語句中的括號,其表示讀取應答包的前多少個字符。

POST包與GET包的創建過程基本相同。

只是我們需要新定義BODY,這個部分可以用字符串的方式進行定義。

params = 'msg=***************************'

我們仍然需要先於服務器進行連接。

conn = httplib.HTTPConnection("ti50*****com");

發送

conn.request(method="POST",url='''/g/s?sid=******************&ngpd=false''',body=params,headers=headers);

可以發現上面的這個公式和發送GET包的格式略有差距。

  1. method 改變了。
  2. url 里面沒有寫域名。
  3. 多了一個body 字段。

其中第二條可以想到,如果沒定義域名,則系統將最近一次與服務器的連接用的域名進行替換。

獲取應答包的方式與GET包相同。


亂七八糟的小應用。

(一) 隨機字符串的生成。

當我們用POST做一些很有趣的事情時,常常會遇到服務器驗證神馬的,有時候我們可以用隨機字符串來處理這樣的情況。

python 中給了隨機數的庫…… random。

對於簡單的應用非常方便。例如我們產生a與b 之間的一個隨機整數。

random.randint(a,b)

image

知道了這步,我們可以很簡單的編寫一個隨機字符串的程序了,

from random import Random 
def random_str(randomlength): 
    str = '' 
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' 
    length = len(chars) - 1 
    random = Random() 
    for i in range(randomlength): 
        str+=chars[random.randint(0, length)] 
    return str

顯然當調用此函數時應該給出隨機字符串長度。

image

當然,我們也可以通過修改chars中的字符來定義隨機字符串中的字符。

(二) 程序運行時間

我們現在給出一個非常不精確的程序時間計算方法,

from time import clock as now

start = now()

finish = now()

run_time = finish - start

print run_time
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM