1. 程式人生 > >16,python實現----HTTP請求報文和響應報文

16,python實現----HTTP請求報文和響應報文

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()