Python 中的POST/GET包構建以及隨機字符串的生成
現在,我們來用Python,創建GET包和POST包。
至于有什么用處,大家慢慢體會。
Python 中包含了大量的庫,作為一門新興的語言,Python 對HTTP有足夠強大的支持。
現在,我們引入新的庫 httplib 以及 urllib
這兩個庫根據名稱,我們可以知道他們是對于HTTP以及URL的操作。
首先我們先要與服務器建立連接。(我們以某微博作為例子實現下文的各種功能)
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包的格式略有差距。
method 改變了。
url 里面沒有寫域名。
多了一個body 字段。
其中第二條可以想到,如果沒定義域名,則系統將最近一次與服務器的連接用的域名進行替換。
獲取應答包的方式與GET包相同。
亂七八糟的小應用。
(一) 隨機字符串的生成。
當我們用POST做一些很有趣的事情時,常常會遇到服務器驗證神馬的,有時候我們可以用隨機字符串來處理這樣的情況。
python 中給了隨機數的庫…… random。
對于簡單的應用非常方便。例如我們產生a與b 之間的一個隨機整數。
random.randint(a,b)
>>> random.randint(10,20)
>>> 15
知道了這步,我們可以很簡單的編寫一個隨機字符串的程序了,
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
顯然當調用此函數時應該給出隨機字符串長度。
當然,我們也可以通過修改chars中的字符來定義隨機字符串中的字符。
(二) 程序運行時間
我們現在給出一個非常不精確的程序時間計算方法,
from time import clock as now start = now() finish = now() run_time = finish - start print run_time