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程序设计入门(3)数组的使用
Jun 16 Python
python进阶教程之循环对象
Aug 30 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
基于进程内通讯的python聊天室实现方法
Jun 28 Python
Python实时获取cmd的输出
Dec 13 Python
PyTorch CNN实战之MNIST手写数字识别示例
May 29 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
python浪漫表白源码
Apr 05 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
set在python里的含义和用法
Jun 24 Python
django页面跳转问题及注意事项
Jul 18 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 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来写记数器(详细介绍)
2006/10/09 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
php实现每日签到功能
2018/11/29 PHP
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
js倒计时显示实例
2016/12/11 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
vue实现表单录入小案例
2019/09/27 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
python正则表达式re模块详细介绍
2014/05/29 Python
python生成二维码的实例详解
2017/10/29 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
python剪切视频与合并视频的实现
2020/03/03 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
日本小田急百货官网:Odakyu
2018/07/19 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
后备干部培训方案
2014/05/22 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL