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的接口测试框架实例
Nov 04 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
python 日志增量抓取实现方法
Apr 28 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
python 协程 gevent原理与用法分析
Nov 22 Python
python 如何调用 dubbo 接口
Sep 24 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
Python 发送SMTP邮件的简单教程
Jun 24 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 版本]
2007/03/20 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
JS编程小常识很有用
2012/11/26 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
Python面向对象编程基础解析(一)
2017/10/26 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
计算机科学与技术应届生求职信
2013/11/07 职场文书
博士生入学考试推荐信
2013/11/17 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
2014年最新学习全国两会精神心得
2014/03/17 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python