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语言技巧之三元运算符使用介绍
Mar 04 Python
Python中的Classes和Metaclasses详解
Apr 02 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
Python读写docx文件的方法
May 08 Python
Python实现Dijkstra算法
Oct 17 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
以文本方式上传二进制文件的PHP程序
2006/10/09 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
AngularJS实现表单元素值绑定操作示例
2017/10/11 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
JavaScript中var的重要性实例分析
2019/07/09 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
"序列点" 是什么
2016/07/29 面试题
金士达面试非笔试
2012/03/14 面试题
小学门卫岗位职责
2013/12/17 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
护理专业求职信
2014/06/15 职场文书
学术会议通知
2015/04/15 职场文书
公司开会通知
2015/04/20 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
mysql查看表结构的三种方法总结
2022/07/07 MySQL