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 从远程服务器下载东西的代码
Feb 10 Python
python的迭代器与生成器实例详解
Jul 16 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python之reload流程实例代码解析
Jan 29 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
python读取ini配置的类封装代码实例
Jan 08 Python
解决keras加入lambda层时shape的问题
Jun 11 Python
Python爬虫如何应对Cloudflare邮箱加密
Jun 24 Python
Python中Qslider控件实操详解
Feb 20 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 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 获取远程文件大小的3种解决方法
2013/07/11 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
跟老齐学Python之网站的结构
2014/10/24 Python
python登陆asp网站页面的实现代码
2015/01/14 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
python K近邻算法的kd树实现
2018/09/06 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
python中p-value的实现方式
2019/12/16 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
大学生预备党员自我评价分享
2013/11/16 职场文书
军训学生自我鉴定
2014/02/12 职场文书
实习生矿工检讨书
2014/10/13 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
单位考核鉴定意见
2015/06/05 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
SQL Server中搜索特定的对象
2022/05/25 SQL Server