Python socket如何解析HTTP请求内容


Posted in Python onFebruary 12, 2022

socket解析HTTP请求内容

思路

1. 解析HTTP请求的头部

HTTP请求头部的结束符行为"\r\n",可以按行读取HTTP请求头的内容,如果读到一行为"\r\n",说明HTTP请求头结束。

2. 请求头里面含有Content-Length参数

如果HTTP请求里面有Content-Length参数,说明HTTP请求的内容大小是确定的,请求直接读取Content-Length的值,然后读取相应字节的的内容即可。

3. 请求头里面含有Transfer-Encoding: chunked 参数

如果HTTP请求里面有Transfer-Encoding参数,说明HTTP请求的内容大小是不确定的,这种内容的结束符是"0\r\n\r\n",因此可以按行读取HTTP请求的内容部分,如果连续读到"0\r\n"和"\r\n"说明内容读取完毕。

代码实现

代码中: self._file 代表的是socket.makefile() 

def get_http_content(self):
        content_length = 0
        transfer_encoding = False
        while True:
            req_line = self._file.readline()
            req_line = str(req_line, "utf-8")
 
            # 遇到http头结束符
            # 读取http内容
            if req_line == "\r\n":
                if content_length != 0:
                    content = self._file.read(content_length)
                    content = str(content, "utf-8")
                    self._content = content
                    return None
 
                if transfer_encoding:
                    content = ""
                    self._file.readline()
                    while True:
                        line = self._file.readline()
                        line = str(line, "utf-8")
                        if line == "0\r\n":
                            sub_line = self._file.readline()
                            sub_line = str(sub_line, "utf-8")
                            if sub_line == "\r\n":
                                self._content = content
                                return None
                        else:
                            content += line
                            continue
                    self._content = False
 
            # 头文件没有结束
            # 并且没有找到关于内容大小的字段
            else:
                if content_length == 0 and transfer_encoding is False:
                    words = req_line.split()
                    if words[0] == "Content-Length:":
                        content_length = int(words[1])
                    if words[0] == "Transfer-Encoding:":
                        transfer_encoding = True
 
            self._content = False

socket 模拟http请求

# coding: utf-8
import socket
from urllib.parse import urlparse
def get_url(url):
    url = urlparse(url)
    host = url.netloc
    path = url.path
    if path == "":
        path = "/"
    # 建立 socket 连接
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, 80))
    client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode("utf-8"))
    data = b""
    while True:
        d = client.recv(1024)
        if d:
            data += d
        else:
            break
    data = data.decode("utf-8")
    html_data = data.split("\r\n\r\n")[1]
    print(html_data)
    client.close()
    pass
if __name__ == '__main__':
    get_url("http://www.baidu.com")

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python时间整形转标准格式的示例分享
Feb 14 Python
理论讲解python多进程并发编程
Feb 09 Python
python tkinter界面居中显示的方法
Oct 11 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
python pexpect ssh 远程登录服务器的方法
Feb 14 Python
python分数表示方式和写法
Jun 26 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
python单例模式的多种实现方法
Jul 26 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
logging level级别介绍
Feb 21 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 Python
python全面解析接口返回数据
Feb 12 #Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 #Python
python中出现invalid syntax报错的几种原因分析
Feb 12 #Python
python ConfigParser库的使用及遇到的坑
Feb 12 #Python
Python制作春联的示例代码
Jan 22 #Python
Python制作表白爱心合集
基于Python实现一个春节倒计时脚本
Jan 22 #Python
You might like
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
详解python中的json的基本使用方法
2016/12/21 Python
python3设计模式之简单工厂模式
2017/10/17 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
python3中数组逆序输出方法
2020/12/01 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
高级护理专业大学生求职信
2013/10/24 职场文书
门卫岗位安全职责
2013/12/13 职场文书
食堂个人先进事迹
2014/01/22 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
爱心捐款活动总结
2015/05/09 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang