PRO-005:模擬伺服器抓取客戶的請求協議資料
本主題寫一個簡單的程式,抓取瀏覽器請求資料。從而瞭解HTTP協議的格式。本主題使用的技術:
- Socket程式設計;
- IO非同步多路複用API;
- 使用訊號,撲捉訊號(2:CTRL+C)來正常結束程式。
一、程式碼:
# coding =utf-8
import socket # socket程式設計模組
import select # 多路複用模組
import sys # 系統呼叫
import signal
import os
# 方便傳送訊號滅掉這個程式
print('本程式ID:%d,可以使用kill滅之,如果在ipython中不方便結束的話!' % os.getpid())
# 這裡處理ctrl+c的訊號(方便ctrl+c退出)
def handle_int(signum, handler):
print('程式中斷退出,訊號:%d' % signum, '處理器是:{}'.format(handler))
sys.exit(0)
# 繫結對ctrl+c訊號的處理
signal.signal(signalnum=signal.SIGINT, handler=handle_int)
# 下面程式碼為了清晰思路,沒有做任何程式碼的異常處理
# 多路複用資料
io_inputs = []
io_outputs = []
io_error = []
# 建立socket
server_socket = socket.socket(
socket.AF_INET, # 網路地址族:常用的是internet網地址格式(IP地址)
socket.SOCK_STREAM, # 網路通訊方式:流與報文兩種
socket.IPPROTO_TCP) # 通訊協議:資料包的格式
# 繫結地址
server_address = ('', 9999) # 地址包含IP地址與埠地址
server_socket.bind(server_address)
# 監聽
server_socket.listen(2)
# 把server_socket加入多路複用IO中
io_inputs.append(server_socket)
# 開始監控多路複用非同步IO(包含server_socket的連線,新連線的也加入,短線的刪除)
while True:
ready_inputs, ready_outputs, ready_error = select.select(
io_inputs, io_outputs, io_error, None)
# 檢查返回值,並相應的處理,這裡我們只接收,不傳送,所以不處理輸出IO
for fd in ready_inputs:
# 伺服器IO與每個客戶的IO分開處理
if fd == server_socket: # 伺服器IO
# 對伺服器IO的護處理:接收客戶連線
client_socket, client_address = fd.accept() # 這裡需要處理異常,就是伺服器掛掉,退出應用
print('客戶連線:IP=%s,PORT=%d' % client_address) # 這裡需要一個元組,直接使用
# 把新連線的客戶加入多路複用監控處理
io_inputs.append(client_socket)
else: # 每個客戶的IO
# 對客戶IO是接收資料請求:請求都是HTTP協議的請求協議
while True:
buffer = fd.recv(1024*4, 0) # 接收緩衝大小與接收標記
if not buffer:
fd.close() # 關閉
io_inputs.remove(fd) # 客戶退出
print('客戶連退出')
break
else:
print(buffer.decode('UTF-8'))
二、執行效果
在終端下執行,請使用CTRL+C結束。
三、撲捉到的瀏覽器請求協議資料
GET / HTTP/1.1
Host: localhost:9999
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Cookie: username-localhost-8888="2|1:0|10:1547792772|23:username-localhost-8888|44:ZTEyMGU2MmIxOTU5NGQyNDg4NTg4OGZkYTQ1OTk5MjY=|b153a00c7702d49e917acdac6d5343298f681fc91e368ebd2cfc88adb15dccb3"; username-localhost-8889="2|1:0|10:1547621721|23:username-localhost-8889|44:NGE5ODk0NTM0YTMxNGM1ODk4NWI5MGFlOWIzNjc2ZGY=|f7e6e3b82d51248a6afa17355c1e3248844e509996319cfda092f38983124264"; _xsrf=2|3ed5cde2|333f93d1f4756a5072a7443c8a91e406|1545622163
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.2 Safari/605.1.15
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Connection: keep-alive
----
注意最後由有兩個空行。一個空行表示HEADER行與資料體的分割。最後空行是GET方法沒有資料體。
相關文章
- 使用fiddler和安卓模擬器抓取安卓客戶端資料包安卓客戶端
- HTTP協議的請求與資料抓包HTTP協議
- 使用Mock.js模擬資料請求MockJS
- SQL Server儲存過程模擬HTTP請求POST和GET協議SQLServer儲存過程HTTP協議
- 模擬介面請求到web伺服器Web伺服器
- 【轉載】MySQL客戶端伺服器協議MySql客戶端伺服器協議
- SOCKET模擬HTTP請求HTTP
- 使用 node 模擬請求介面
- Swift:面向協議的網路請求Swift協議
- Python 使用socket模擬http請求,從阻塞到協程PythonHTTP
- nginx截獲客戶端請求Nginx客戶端
- Android客戶端請求伺服器端的詳細解釋Android客戶端伺服器
- HTTP 協議六種請求方法HTTP協議
- HTTP協議如何發起請求HTTP協議
- php模擬請求(偽造來源和請求ip)PHP
- 網站提示400 - 請求錯誤,伺服器無法理解客戶端的請求怎麼辦網站伺服器客戶端
- mysqlslap 負載模擬客戶端MySql負載客戶端
- 協議層的攻擊:HTTP請求走私協議HTTP
- [譯]學習HTTP協議的請求行HTTP協議
- Vue-cli 使用json server在本地模擬請求資料VueJSONServer
- vue-cli實現非同步請求返回mock模擬資料Vue非同步Mock
- 使用charles無法抓取到iOS Simulator的請求資料包iOS
- ICAP: 互換客戶端地址協議客戶端協議
- ntp協議及客戶端開發協議客戶端
- 串列埠資料抓取及串列埠通訊模擬串列埠
- 解密協議層的攻擊——HTTP請求走私解密協議HTTP
- HTTP協議GET和POST請求的區別HTTP協議
- HTTP協議中請求方法的Get和PostHTTP協議
- 請求協議中的content-type頭協議
- 使用 Netcat 模擬 HTTP 請求HTTP
- android客戶端向伺服器傳送請求中文亂碼的問Android客戶端伺服器
- nginx 處理客戶端請求的完整過程Nginx客戶端
- CTFHub web前置技能HTTP協議請求方式WebHTTP協議
- Postman模擬瀏覽器網頁請求並獲取網頁資料Postman瀏覽器網頁
- scrapy抓取ajax請求的網頁網頁
- Node.js 使用http客戶端向網站請求資料並儲存Node.jsHTTP客戶端網站
- Linux curl 命令模擬 POST/GET 請求Linux
- C#模擬HTTP請求Post JSONC#HTTPJSON