如何用同一个socket连接,发送多次http请求
发布网友
发布时间:2022-04-22 06:07
我来回答
共1个回答
热心网友
时间:2023-07-08 01:26
#python 3.X
# requests -->urllib -->socket
#导入socket 模块
import socket
#导入url解析的模块
from urllib.parseimport urlparse
#通过socket发送http 请求
def get_url(url):
#解析url ,获取host 及uri
url = urlparse(url)
#将URL解析为6个组件
# <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
host =url.netloc
path =url.path
print(host,path)
#如请求资源为空,则设置为/
if path =="":
path ="/"
#建立socket 客户端连接
client = socket.socket()
client.connect((host, 80))
#发送请求信息 \r\n win 的换行回车 可以fiddler抓包 看看http请求行的格式。
python 3.X 发送的网络包,都是字节,所以,发送的信息,必须编码。
client.send("GET {} HTTP/1.1\r\nHost: {} \r\nConnection:close\r\n\r\n".format( path , host ).encode("utf-8"))
#3.x 网络传输的数据都是字节。必须以字节接收。如果想打印字符串,必须解码。
data =b""
#while 循环接收请求响应的数据。
while True:
d = client.recv(1024)#每次接收1024个字节
if d:#如果接收数据不为空,则拼接
data += d
print(1)
else:#否则,不再接收数据则跳出循环。
break
#print(data.decode())
#把数据解码 (包含响应头 + 响应体【通过浏览器渲染显示在网页中的内容】)
data = data.decode()
#取出响应体
html_data = data.split("\r\n\r\n")[1]
print(html_data)
#关闭客户端链接
client.close()
if __name__ =="__main__":
get_url("http://www.baidu.com")