本篇内容主要讲解“Pythonsocket怎么解析HTTP请求内容”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pythonsocket怎么解析HTTP请求内容”吧!

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()

defget_http_content(self):content_length=0transfer_encoding=FalsewhileTrue:req_line=self._file.readline()req_line=str(req_line,"utf-8")#遇到http头结束符#读取http内容ifreq_line=="\r\n":ifcontent_length!=0:content=self._file.read(content_length)content=str(content,"utf-8")self._content=contentreturnNoneiftransfer_encoding:content=""self._file.readline()whileTrue:line=self._file.readline()line=str(line,"utf-8")ifline=="0\r\n":sub_line=self._file.readline()sub_line=str(sub_line,"utf-8")ifsub_line=="\r\n":self._content=contentreturnNoneelse:content+=linecontinueself._content=False#头文件没有结束#并且没有找到关于内容大小的字段else:ifcontent_length==0andtransfer_encodingisFalse:words=req_line.split()ifwords[0]=="Content-Length:":content_length=int(words[1])ifwords[0]=="Transfer-Encoding:":transfer_encoding=Trueself._content=Falsesocket 模拟http请求

#coding:utf-8importsocketfromurllib.parseimporturlparsedefget_url(url):url=urlparse(url)host=url.netlocpath=url.pathifpath=="":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""whileTrue:d=client.recv(1024)ifd:data+=delse:breakdata=data.decode("utf-8")html_data=data.split("\r\n\r\n")[1]print(html_data)client.close()passif__name__=='__main__':get_url("http://www.baidu.com")

到此,相信大家对“Pythonsocket怎么解析HTTP请求内容”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!