Python学习笔记十六(HTTP协议)

HTTP协议

什么是HTTP协议[1]

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。
简单来说就是一种规则,一种规定。

HTTP是基于TCP/IP通信协议来传递数据,默认使用80端口。浏览器浏览网页使用的就是HTTP协议,也就是说你在访问网页就是在使用HTTP协议。

网页浏览的过程分析

在浏览器中出入网址 http://blog.csdn.net/f704084109 信息会被浏览器发送到csdn 的服务器,服务器给出反馈,浏览器接收到之后对数据进行解释。

步骤如下

  • 浏览器首先向服务器发送HTTP请求
  • 服务器向浏览器返回HTTP响应
  • 如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复以上步骤

HTTP请求

HTTP请求一般包括 请求头+空行+请求体,其中请求头的第一行也可以称为请求首行。

截图
理论图

使用Python 模拟HTTP 请求

import socket

if __name__ == '__main__':
    # 创建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))

    # 发送数据
    # http 请求
    #   请求首行  ==》请求方式(八种,常用两种GET and POST)
    #   请求头
    #   空行
    #   请求体
    head = "GET / HTTP/1.1\r\n"  # 请求方式 请求地址 HTTP/1.1 (请求首行的格式)
    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"))
    # 接收数据
    recv_data = tcp_client_socket.recv(1024)
    # 对二进制数据进行解码

    recv_content = recv_data.decode("utf-8",errors="ignore")
    print(recv_content)
    # 关闭客户端socket
    tcp_client_socket.close()

# 运行结果:
# 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�

模拟访问了百度,结果被限制了(;′⌒`) ,换了一个网站 ,成功得到数据,虽然乱码,但是也说明了,模拟HTTP协议是成功的。

HTTP响应

这些返回的内容是啥? 是服务器给出的响应,反馈。

响应有啥? 响应头+空行+响应体 ,响应头第一行也叫响应首行或者响应行

截图
理论图

使用Python 模拟HTTP服务器给客户端发送响应


import socket


def main():
    """创建一个浏览器可以访问的tcp服务器"""

    # 创建tcp服务器
    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)

    # 循环接收用户的请求
    while True:
        client, address = tcp_server.accept()
        # 接收数据
        data = client.recv(1024).decode("utf-8")
        print(data)

        # 响应的格式
        # 响应头
        # 空行
        # 响应体

        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

        # 返回一个数据
        client.send(content.encode("utf-8"))

        # 关闭连接
        client.close()

    # 关闭
    tcp_server.close()


if __name__ == '__main__':
    main()

# 使用上面的客户端访问这个服务端
# 服务端结果: 请求信息
# 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

# 客户端结果:  响应信息
# HTTP/1.1 200 OK
# Content-type:text/html;charset=utf-8
# Content-length:5
# 
# DragonFang 欢迎你

记录
HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头


到此结 DragonFangQy 2018.5.7


  1. http 百度百科

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容

  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,373评论 6 152
  • HTTP概述 超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最...
    曹渊说创业阅读 3,855评论 2 61
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 5,226评论 3 82
  • 前言:最近发现自己在网络相关这一块基础很是欠缺,所以准备花时间了解一下,本文主要是讲http协议的一些基础,和一些...
    justCode_阅读 2,094评论 0 23
  • 本文整理自MIN飞翔博客 [1] 1. 概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或...
    HoyaWhite阅读 2,677评论 2 20