Python學(xué)習(xí)筆記十六(HTTP協(xié)議)

HTTP協(xié)議

什么是HTTP協(xié)議[1]

超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。
簡(jiǎn)單來說就是一種規(guī)則,一種規(guī)定。

HTTP是基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),默認(rèn)使用80端口。瀏覽器瀏覽網(wǎng)頁使用的就是HTTP協(xié)議,也就是說你在訪問網(wǎng)頁就是在使用HTTP協(xié)議。

網(wǎng)頁瀏覽的過程分析

在瀏覽器中出入網(wǎng)址 http://blog.csdn.net/f704084109 信息會(huì)被瀏覽器發(fā)送到csdn 的服務(wù)器,服務(wù)器給出反饋,瀏覽器接收到之后對(duì)數(shù)據(jù)進(jìn)行解釋。

步驟如下

  • 瀏覽器首先向服務(wù)器發(fā)送HTTP請(qǐng)求
  • 服務(wù)器向?yàn)g覽器返回HTTP響應(yīng)
  • 如果瀏覽器還需要繼續(xù)向服務(wù)器請(qǐng)求其他資源,比如圖片,就再次發(fā)出HTTP請(qǐng)求,重復(fù)以上步驟

HTTP請(qǐng)求

HTTP請(qǐng)求一般包括 請(qǐng)求頭+空行+請(qǐng)求體,其中請(qǐng)求頭的第一行也可以稱為請(qǐng)求首行。

截圖
理論圖

使用Python 模擬HTTP 請(qǐng)求

import socket

if __name__ == '__main__':
    # 創(chuàng)建tcp客戶端socket
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 建立連接 
    # tcp_client_socket.connect(("115.239.210.27", 443))
    tcp_client_socket.connect(("110.80.135.14", 80))

    # 發(fā)送數(shù)據(jù)
    # http 請(qǐng)求
    #   請(qǐng)求首行  ==》請(qǐng)求方式(八種,常用兩種GET and POST)
    #   請(qǐng)求頭
    #   空行
    #   請(qǐng)求體
    head = "GET / HTTP/1.1\r\n"  # 請(qǐng)求方式 請(qǐng)求地址 HTTP/1.1 (請(qǐng)求首行的格式)
    head += "Host: tool.chinaz.com\r\n"
    head += "Connection: keep-alive\r\n"
    head += "Cache-Control: max-age=0\r\n"
    head += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"
    head += "Upgrade-Insecure-Requests: 1\r\n"
    head += "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36\r\n"
    head += "Referer: https://www.baidu.com/link?url=afpMfCo1NMtFumAHT3m3nlMewV58ME68wzSXkMYm1Mc16Mtqc3w0tP9zChcTnmx0&wd=&eqid=c3b3724400081504000000045aef27ee\r\n"
    head += "Accept-Encoding: gzip, deflate, sdch\r\n"
    head += "Accept-Language: zh-CN,zh;q=0.8\r\n"
    head += "Cookie: qHistory=aHR0cDovL3Rvb2wuY2hpbmF6LmNvbSvnq5nplb/lt6Xlhbc=; UM_distinctid=163363420b283-0d8a48d0d369eb-3e70055f-1fa400-163363420ba2c9; CNZZDATA5082706=cnzz_eid%3D1074704039-1525620421-null%26ntime%3D1525620421; mainurl=%20\r\n"

    request = head + "\r\n"

    tcp_client_socket.send(request.encode("utf-8"))
    # 接收數(shù)據(jù)
    recv_data = tcp_client_socket.recv(1024)
    # 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行解碼

    recv_content = recv_data.decode("utf-8",errors="ignore")
    print(recv_content)
    # 關(guān)閉客戶端socket
    tcp_client_socket.close()

# 運(yùn)行結(jié)果:
# HTTP/1.1 200 OK
# Cache-Control: private
# Content-Length: 6305
# Content-Type: text/html; charset=utf-8
# Content-Encoding: gzip
# Server: Microsoft-IIS/7.5
# X-AspNet-Version: 4.0.30319
# X-Powered-By: ASP.NET
# Date: Sun, 06 May 2018 16:19:27 GMT
# 
# ?hC?PaF?Bk?? "xBLZ?0? ,a| ??m/N9???BG?

模擬訪問了百度,結(jié)果被限制了(;′⌒`) ,換了一個(gè)網(wǎng)站 ,成功得到數(shù)據(jù),雖然亂碼,但是也說明了,模擬HTTP協(xié)議是成功的。

HTTP響應(yīng)

這些返回的內(nèi)容是啥? 是服務(wù)器給出的響應(yīng),反饋。

響應(yīng)有啥? 響應(yīng)頭+空行+響應(yīng)體 ,響應(yīng)頭第一行也叫響應(yīng)首行或者響應(yīng)行

截圖
理論圖

使用Python 模擬HTTP服務(wù)器給客戶端發(fā)送響應(yīng)


import socket


def main():
    """創(chuàng)建一個(gè)瀏覽器可以訪問的tcp服務(wù)器"""

    # 創(chuàng)建tcp服務(wù)器
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 重用
    tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    tcp_server.bind(("", 8877))
    tcp_server.listen(128)

    # 循環(huán)接收用戶的請(qǐng)求
    while True:
        client, address = tcp_server.accept()
        # 接收數(shù)據(jù)
        data = client.recv(1024).decode("utf-8")
        print(data)

        # 響應(yīng)的格式
        # 響應(yīng)頭
        # 空行
        # 響應(yīng)體

        header = "HTTP/1.1 200 OK\r\n"
        header += "Content-type:text/html;charset=utf-8\r\n"
        header += "Content-length:5\r\n"
        body = "DragonFang 歡迎你"

        content = header + "\r\n" + body

        # 返回一個(gè)數(shù)據(jù)
        client.send(content.encode("utf-8"))

        # 關(guān)閉連接
        client.close()

    # 關(guān)閉
    tcp_server.close()


if __name__ == '__main__':
    main()

# 使用上面的客戶端訪問這個(gè)服務(wù)端
# 服務(wù)端結(jié)果: 請(qǐng)求信息
# GET / HTTP/1.1
# Host: tool.chinaz.com
# Connection: keep-alive
# Cache-Control: max-age=0
# Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
# Upgrade-Insecure-Requests: 1
# User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
# Referer: https://www.baidu.com/link?url=afpMfCo1NMtFumAHT3m3nlMewV58ME68wzSXkMYm1Mc16Mtqc3w0tP9zChcTnmx0&wd=&eqid=c3b3724400081504000000045aef27ee
# Accept-Encoding: gzip, deflate, sdch
# Accept-Language: zh-CN,zh;q=0.8
# Cookie: qHistory=aHR0cDovL3Rvb2wuY2hpbmF6LmNvbSvnq5nplb/lt6Xlhbc=; UM_distinctid=163363420b283-0d8a48d0d369eb-3e70055f-1fa400-163363420ba2c9; CNZZDATA5082706=cnzz_eid%3D1074704039-1525620421-null%26ntime%3D1525620421; mainurl=%20

# 客戶端結(jié)果:  響應(yīng)信息
# HTTP/1.1 200 OK
# Content-type:text/html;charset=utf-8
# Content-length:5
# 
# DragonFang 歡迎你

記錄
HTTP協(xié)議---HTTP請(qǐng)求中的常用請(qǐng)求字段和HTTP的響應(yīng)狀態(tài)碼及響應(yīng)頭


到此結(jié)?DragonFangQy 2018.5.7


  1. http 百度百科 ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,741評(píng)論 6 152
  • HTTP概述 超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol) 是互聯(lián)網(wǎng)上應(yīng)用最...
    曹淵說創(chuàng)業(yè)閱讀 3,954評(píng)論 2 61
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng),內(nèi)容來源于博客園作者M(jìn)IN飛翔的HTTP協(xié)...
    Sivin閱讀 5,345評(píng)論 3 82
  • 前言:最近發(fā)現(xiàn)自己在網(wǎng)絡(luò)相關(guān)這一塊基礎(chǔ)很是欠缺,所以準(zhǔn)備花時(shí)間了解一下,本文主要是講http協(xié)議的一些基礎(chǔ),和一些...
    justCode_閱讀 2,149評(píng)論 0 23
  • 本文整理自MIN飛翔博客 [1] 1. 概念 協(xié)議是指計(jì)算機(jī)通信網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定或...
    HoyaWhite閱讀 2,796評(píng)論 2 20

友情鏈接更多精彩內(nèi)容