16,python實現----HTTP請求報文和響應報文
阿新 • • 發佈:2019-01-06
import socket import re ''' 請求報文: 請求行: GET / HTTP/1.1 請求行格式: 請求方式 請求的資源路徑 HTTP版本 請求頭: Host: www.baidu.com 代表被瀏覽器請求的伺服器地址(埠) Connection: keep-alive 代表連線方式 keep-alive-->長連線 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36 代表瀏覽器的訪問伺服器的身份資訊 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 代表瀏覽器可以接收的檔案型別 Accept-Encoding: gzip, deflate, br 代表瀏覽器可接受的壓縮演算法 Accept-Language: zh-CN,zh;q=0.9 代表瀏覽器支援的語言 請求報文組成: 請求行\r\n+請求頭\r\n+空行(\r\n)+請求體\r\n(瀏覽器給伺服器傳送的資料,GET沒有資料) ''' ''' 響應報文: 響應行: HTTP/1.1 200 OK 格式:HTTP版本 狀態碼 說明 2xx:代表成功 3xx:代表重定向(某個伺服器有問題會重定向到另外一臺伺服器上) 4xx:代表瀏覽器故障 5xx:代表伺服器故障 響應頭: Connection: Keep-Alive 代表連線方式,keep-Alive:長連線 Content-Encoding: gzip 代表支援的壓縮演算法 Content-Type: text/html; charset=utf-8 代表返回瀏覽器請求的資料 Date: Fri, 06 Apr 2018 11:42:46 GMT 代表時間 響應報文組成: 響應行\r\n+響應頭\r\n+空行(\r\n)+響應體(伺服器傳送給瀏覽器的資料) ''' def main(): # 建立tcpsocket套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 連線伺服器 tcp_socket.connect(('www.baidu.com', 80)) # 拼接請求報文 # 請求行 request_line = 'GET / HTTP/1.1\r\n' # 請求頭 request_headers = 'Host:www.baidu.com\r\n' # 報文資料 request_data = request_line + request_headers + '\r\n' # 傳送請求報文資料 tcp_socket.send(request_data.encode('utf-8')) # 接收響應報文資料 recv_data = tcp_socket.recv(10240) recv_data = recv_data.decode() # print(recv_data) # 解析響應報文資料 # reslult = re.findall(r'\r\n\r\n(.*)', recv_data, re.S) reslult = recv_data.split('\r\n\r\n')[1] # reslult = reslult.decode() # 寫入到檔案中 with open('info.txt', 'w') as file: file.write(reslult) # 關閉套接字 tcp_socket.close() if __name__ == '__main__': main()