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开发的小球完全弹性碰撞游戏代码
Oct 15 Python
从零学Python之引用和类属性的初步理解
May 15 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
python-opencv颜色提取分割方法
Dec 08 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Python中拆分字符串的操作方法
Jul 23 Python
Python的bit_length函数来二进制的位数方法
Aug 27 Python
Python之指数与E记法的区别详解
Nov 21 Python
pytorch快速搭建神经网络_Sequential操作
Jun 17 Python
Pandas-DataFrame知识点汇总
Mar 16 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
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
Javascript的比较汇总
2016/07/25 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python类和继承用法实例
2015/07/07 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
python如何代码集体右移
2020/07/20 Python
Python同时处理多个异常的方法
2020/07/28 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
python如何实现word批量转HTML
2020/09/30 Python
python中random模块详解
2021/03/01 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
城市精细化管理实施方案
2014/03/04 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
工作失职检讨书500字
2014/10/17 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
针对吵架老公保证书
2015/05/08 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
mysql sock文件存储了什么信息
2022/07/15 MySQL