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 显示数组全部元素的方法
Apr 19 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
python添加菜单图文讲解
Jun 04 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
python对XML文件的操作实现代码
Mar 27 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
序列化Python对象的方法
Aug 01 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
Sep 30 Python
Python读写锁实现实现代码解析
Nov 28 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
Python爬虫之爬取二手房信息
Apr 27 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-fpm的两种进程管理模式详解
2013/06/03 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
十条建议帮你提高Python编程效率
2016/02/16 Python
Python生成器generator用法示例
2018/08/10 Python
python如何实现代码检查
2019/06/28 Python
python操作cfg配置文件方式
2019/12/22 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
厨师岗位职责
2013/11/12 职场文书
全陪导游欢迎词
2014/01/17 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
销售经理工作职责
2014/02/03 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
运动会加油稿30字
2015/07/21 职场文书
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技