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 01 Python
Python递归遍历列表及输出的实现方法
May 19 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
Python元组拆包和具名元组解析实例详解
Mar 26 Python
Python正则表达式指南 推荐
Oct 09 Python
python selenium 弹出框处理的实现
Feb 26 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
关于Kotlin中SAM转换的那些事
Sep 15 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 EOT定界符的使用详解
2008/09/30 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
深入理解PHP内核(一)
2015/11/10 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
python读取文件名并改名字的实例
2019/01/07 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
2019/08/22 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
一套PHP的笔试题
2013/05/31 面试题
linux面试题参考答案(4)
2014/09/21 面试题
市场调研项目授权委托书范本
2014/10/04 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript