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操作Elasticsearch数据索引的教程
Apr 08 Python
Python修改MP3文件的方法
Jun 15 Python
python数据结构之图深度优先和广度优先实例详解
Jul 08 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
python实现简单登陆流程的方法
Apr 22 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
Python中bisect的使用方法
Dec 31 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
Python爬虫网络请求之代理服务器和动态Cookies
Apr 12 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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
zf框架的Filter过滤器使用示例
2014/03/13 PHP
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
python进行文件对比的方法
2018/12/24 Python
基于Python的PIL库学习详解
2019/05/10 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
意大利网上药房:Farmacia 33
2020/01/27 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
HR喜欢的自荐信格式
2013/10/08 职场文书
幼儿如何来做好自我评价
2013/11/05 职场文书
策划主管的工作职责
2013/11/24 职场文书
大学生思想汇报范文
2013/12/31 职场文书
自我介绍演讲稿
2014/01/15 职场文书
医学生就业推荐表自我鉴定
2014/03/26 职场文书
英文推荐信格式范文
2014/05/09 职场文书
2014年师德承诺书
2014/05/23 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
瘦西湖导游词
2015/02/03 职场文书
施工安全保证书
2015/05/09 职场文书
宇宙与人观后感
2015/06/05 职场文书
统招统分证明
2015/06/23 职场文书
退伍军人感言
2015/08/01 职场文书