网络请求
1.服务端
from socket import socket, SOCK_STREAM, AF_INET
from datetime import datetime
#创建服务端
def main():
# 1.创建套接字对象并指定使用哪种传输服务
# AF_INET - ipv4
# AF_INET6 - ipv6
# type = SOCK_STREAM - TCP套接字
# type = SOCK_DGRAM - UDP套接字
# type = SOCK_RAW - 原始套接字
server = socket(family=AF_INET, type=SOCK_STREAM)
# 2.绑定IP地址和端口(区分不同的服务)
# 端口值: 0-65535 其中1024以下的端口叫"著名端口"用于HTTP,FTP协议使用
# (查看ip地址命令: netstat)
# 同一时间同一个端口上只能绑定一个服务,否则会报错
server.bind(('10.7.185.90', 3458))
# 3.开启监听 - 监听客户端连接到服务器
server.listen(512)
print('服务器启动开始监听...')
# 4.通过循环接收客户端的连接并作出相应的处理(提供服务)
while True:
# 当有客户端连接当前服务器的时候, 就会执行accept()调用语句
# accept(): 返回客户端对象和客户端的地址, 该方法是一个阻塞方法
# 如果没有客户端连接到服务器, 这个方法就会阻塞代码不会向下执行
client, addr = server.accept()
print(str(addr) + '连接到了服务器.')
# 现在的服务是单线程工作模式的所以只能受理一个客户端的请求
# 一个客户端断开连接以后下一个客户端才能被接纳其他客户端继续排队等待
while True:
in_msg = client.recv(1024).decode('utf-8')
print(in_msg)
if in_msg == 'bye':
break
out_msg = input('请输入: ')
# 5.给被连接的客户端发送数据. 注意:在这里发送的数据必须是二进制数据
# 字符串.encode() ---> 将字符串转换成二进制
# client.send(str(datetime.now()).encode('utf-8')) #显示时间
client.send(out_msg.encode('utf-8'))
# 6.断开连接
client.close()
if __name__ == '__main__':
main()
2.客户端
from socket import socket, AF_INET, SOCK_STREAM
def main():
# 1.创建socket对象
client = socket()
# 2.连接服务器
client.connect(('10.7.185.90', 3458))
while True:
out_msg = input('请输入: ')
client.send(out_msg.encode('utf-8'))
if out_msg == 'bye':
break
# 3.从服务器接收数据
# 参数:想要接收的数据大小(字节)
# decode():将二进制数据转换成字符串
in_msg = client.recv(1024).decode('utf-8')
print(in_msg)
client.close()
if __name__ == '__main__':
main()
3.请求网络
import requests
def main():
# url:请求地址
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
# 通过get方式去获取指定地址的数据。返回值是服务器的响应
# result = requests.get(url)
result = requests.get('https://www.apiopen.top/satinApi', params={'type': 1, 'page': 1})
# print(result)
# 获取返回的数据的字符串
print(result.text)
# 获取返回的数据的json结果(列表或者字典),可能会抛出异常
r_dict = result.json()
print(r_dict['msg'])
# 获取返回的数据的二进制形式
print(result.content)
# 下载指定图片
result = requests.get('http://wimg.spriteapp.cn/profile/large/2017/03/01/58b6ed2126d85_mini.jpg')
data = result.content
with open('dog.jpg', 'wb') as ff:
ff.write(data)
print('图片下载完成')
if __name__ == '__main__':
main()
练习:下载该网页所有profile_image中的图片
import requests
# url:请求地址
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
# 通过get方式去获取指定地址的数据。返回值是服务器的响应
result = requests.get(url)
# result = requests.get('https://www.apiopen.top/satinApi', params={'type': 1, 'page': 1})
# print(result)
# 获取返回的数据的字符串
print(result.text)
# 获取返回的数据的json结果(列表或者字典),可能会抛出异常
r_dict = result.json()
print(r_dict['msg'])
# data = r_dict['data']
# print(data)
# 下载图片
for key in r_dict['data']:
url1 = (key['profile_image'])
# print(url1)
resp = requests.get(url1)
# 对url进行切片取出最后一个/后面的内容作为文件名
filename = url1[url1.rfind('/') + 1:]
with open(filename, 'wb') as f:
f.write(resp.content)
print('图片下载完成!')