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 14 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
Python中查看文件名和文件路径
Mar 31 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
python基于物品协同过滤算法实现代码
May 31 Python
flask框架使用orm连接数据库的方法示例
Jul 16 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
python实现图片九宫格分割
Mar 07 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
Autopep8的使用(python自动编排工具)
Mar 02 Python
如何理解及使用Python闭包
Jun 01 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
全国中波电台频率表
2020/03/11 无线电
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python 命名规范知识点汇总
2020/02/14 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
安全事故检讨书
2014/01/18 职场文书
工程建设实施方案
2014/03/14 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
求职自荐信怎么写
2015/03/04 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
HTML基础详解(上)
2021/10/16 HTML / CSS