网站域名列表怎么填写seo任务
标题python使用socket向百度发送http/get报文 并解析存储数据
目录
- 标题python使用socket向百度发送http/get报文 并解析存储数据
- 1. 导入socket的包
- 2. 实例化一个socket对象
- 3. 发送链接请求 建立链接
- 4. 发送http的报文 进行交互
- 5. 数据接收
- 6. 响应报文的数据分析
- 7. 数据存储
- 8. 完整代码
- 9. 效果
1. 导入socket的包
import socket
2. 实例化一个socket对象
# 实例化socket
socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.AF_INET就是 ipv4
socket.SOCK_STREAM tcp的方式
3. 发送链接请求 建立链接
# 链接请求
socket_obj.connect(('www.baidu.com', 80))
注意端口号 是int类型
4. 发送http的报文 进行交互
# 发送get的报文数据
socket_obj.send(b'GET https://www.baidu.com HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n')
报文格式:
中间的换行 使用 \r\n表示
5. 数据接收
# 数据的接受
buf = []
while True:
#循环接受 每次接受1024 就把接受的数据放到buf中b = socket_obj.recv(1024)if b:buf.append(b)else:break
data = b''.join(buf)
print(data)
6. 响应报文的数据分析
# 数据的分离 把data二进制的数据转为字符串 gb2312
#\r\n\r\n 代表就是中间的 空白行 换行2次 就空出一行
header, body = data.decode('gb2312').split("\r\n\r\n", 1)
7. 数据存储
#把响应头的数据存到./header.txt文件中
with open("./header.txt", 'w', encoding='gb2312') as fs1:fs1.write(header)
#把响应体的数据存到./baidu.html文件中
with open("./baidu.html", 'w', encoding='gb2312') as fs2:fs2.write(body)
8. 完整代码
import socket# 实例化socket
socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 链接请求
socket_obj.connect(('www.baidu.com', 80))# 发送数据
socket_obj.send(b'GET https://www.baidu.com HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n')# 数据的接受
buf = []
while True:b = socket_obj.recv(1024)if b:buf.append(b)else:break
data = b''.join(buf)
print(data)
# 数据的分离 把二进制的数据转为字符串
header, body = data.decode('gb2312').split("\r\n\r\n", 1)with open("./header.txt", 'w', encoding='gb2312') as fs1:fs1.write(header)
with open("./baidu.html", 'w', encoding='gb2312') as fs2:fs2.write(body)
9. 效果
header.txt
baidu.html