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中实现两个字典(dict)合并的方法
Sep 23 Python
Python的randrange()方法使用教程
May 15 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
Python内置模块logging用法实例分析
Feb 12 Python
30秒轻松实现TensorFlow物体检测
Mar 14 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
Django数据统计功能count()的使用
Nov 30 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
header跳转和include包含问题详解
2012/09/08 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
php实现简单爬虫的开发
2016/03/28 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
Python中super的用法实例
2015/05/28 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
python已协程方式处理任务实现过程
2019/12/27 Python
python实现UDP协议下的文件传输
2020/03/20 Python
Python自动登录QQ的实现示例
2020/08/28 Python
python之随机数函数的实现示例
2020/12/30 Python
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
应届生会计求职信
2013/11/11 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
英语系本科生求职信范文
2013/12/18 职场文书
学生评语大全
2014/04/18 职场文书
党在我心中演讲稿
2014/09/02 职场文书
世界遗产的导游词
2015/02/13 职场文书