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多线程编程简单介绍
Apr 13 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
django启动uwsgi报错的解决方法
Apr 08 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 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地址获取函数代码(端口等) 推荐
2010/05/15 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
微信自定义分享php代码分析
2016/11/24 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
简单的Python调度器Schedule详解
2019/08/30 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
印度购物网站:TATA CLiQ
2017/11/23 全球购物
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
文史专业毕业生自荐信
2013/11/17 职场文书
求职推荐信范文
2013/12/01 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
成本会计实训报告
2014/11/05 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
高中家长意见怎么写
2015/06/03 职场文书