课程名称:Python3 进阶教程(新版)
章节名称:第7章 Python的网络编程
讲师名称:咚咚呛
课程内容
- 套接字Socket与套接字编程
- 自带的HTTP服务器
- 发送HTTP请求
- requests库
- HTTP响应内容
学习收获
套接字Socket与套接字编程
要进行网络通信,需要建立起通信双方的连接,连接的双方分别称为客户端和服务端,在Python中,使用套接字socket来建立起网络连接。
对于客户端和服务端,都是使用socket
来建立连接的,但是在使用行为上,客户端和服务端会有一些不一样。
服务端建立需要四个步骤:
- 新建socket
- 绑定IP和端口(bind)
- 监听连接(listen)
- 接受连接(accept)
import socket
server = socket.socket() # 1. 新建socket
server.bind(('127.0.0.1', 8999)) # 2. 绑定IP和端口(其中127.0.0.1为本机回环IP)
server.listen(5) # 3. 监听连接
s, addr = server.accept() # 4. 接受连接
print('connect addr:{}'.format(addr))
content =s.recv(1024)
print(str(content, encoding='utf-8')) # 接受来自客户端的消息,并编码打印出来
s.close()
客户端建立则简单一些,仅需两个步骤:
1、新建socket
2、连接服务端(connect)
import socket
client = socket.socket() # 1. 新建socket
client.connect(('127.0.0.1', 8999)) # 2. 连接服务端(注意,IP和端口要和服务端一致)
client.send(bytes('Hello World. Hello Socket', encoding='utf-8')) # 发送内容,注意发送的是字节字符串。
client.close()
当网络连接上以后,客户端和服务端就可以进行数据通信了,套接字通过send()
函数发送数据,通过recv()
函数接收数据。
自带的HTTP服务器
在互联网的世界中,网页、手机H5等都是通过HTTP向用户提供服务的,这些信息存储在HTTP服务器中,HTTP服务器是一种特殊的Socket服务器,它在网络连接之上,定义了HTTP协议,使得网页、手机H5等数据,都可以以标准的HTTP协议进行传输。
Python提供了简易的HTTP服务器,可以直接运行起来。在终端,输入这条命令,就可以启动一个HTTP服务器。
python -m http.server
python -m http.server 9999 -d /user # 指定端口和根目录
发送HTTP请求
Python提供了相关的库urllib
,通过urllib
包里面的request
,可以向其他HTTP服务器发起请求。
from urllib import request
response = request.urlopen('http:127.0.0.1:8000')
print(response.status)
for k,v in response.getheaders():
print('{}:{}'.format(k,v))
requests库
requests库是著名的Python第三方库,使用requests库,可以定制化你的HTTP请求,包括请求方法,请求参数等等。
在一般的使用上,requests和urllib没有太大区别,但是在复杂的场景中,requests可以提供urllib无法提供的强大功能。因此,在使用上,建议使用requests库代替urllib库来进行HTTP请求等的操作。
由于requests是第三方库,因此在使用前,需要安装。
pip install requests
请求示例
response = requests.get('https://www.imooc.com')
# 打印状态码
print(response.status_code)
# 打印回应头
print(response.headers)
HTTP响应内容
网络爬虫是典型的应用程序,它的工作原理就是通过不断的请求互联网的页面,并从回应中解析获取出有用的数据;数据积累后,可以有很多用处。
import requests
response = requests.get('https://www.imooc.com')
content = str(response.content, encoding='utf-8') # ==> 打印具体内容
content_list = content.split('\n') # 分行
len(content_list) # 打印页面内容的行数
for line in content_list:
if 'href' in line:
print(line.strip())