🌐 26. 网络编程

本章概述

学习 Python 网络编程:socket 编程、HTTP 请求、常用网络库。 预计学习时间:60 分钟


26.1 Socket 编程

什么是 Socket

Socket 是网络通信的端点,两台计算机通过 Socket 进行数据传输。

TCP 客户端

import socket
 
# 创建socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# 连接服务器
client.connect(("www.example.com", 80))
 
# 发送数据
client.send(b"GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n")
 
# 接收数据
response = client.recv(4096)
print(response.decode())
 
# 关闭连接
client.close()

TCP 服务端

import socket
 
# 创建socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# 绑定地址和端口
server.bind(("0.0.0.0", 8888))
 
# 监听
server.listen(5)
print("服务器启动,监听端口8888...")
 
while True:
    # 接受连接
    client, addr = server.accept()
    print(f"新连接:{addr}")
 
    # 接收数据
    data = client.recv(1024)
    print(f"收到:{data.decode()}")
 
    # 发送数据
    client.send(b"Hello from server!")
 
    # 关闭连接
    client.close()

UDP 客户端

import socket
 
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
# 发送数据
client.sendto(b"Hello", ("127.0.0.1", 8888))
 
# 接收数据
data, addr = client.recvfrom(1024)
print(f"收到:{data.decode()}")
 
client.close()

UDP 服务端

import socket
 
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(("0.0.0.0", 8888))
 
print("UDP服务器启动...")
 
while True:
    data, addr = server.recvfrom(1024)
    print(f"收到{addr}{data.decode()}")
    server.sendto(b"Hello from UDP server!", addr)

TCP vs UDP

  • TCP:面向连接,可靠,有序,速度慢
  • UDP:无连接,不可靠,可能乱序,速度快

26.2 HTTP 请求

requests 库

Python 最常用的 HTTP 请求库。

安装

pip install requests

GET 请求

import requests
 
# 基本GET请求
response = requests.get("https://api.example.com/users")
 
# 状态码
print(response.status_code)  # 200
 
# 响应头
print(response.headers)
 
# 文本内容
print(response.text)
 
# JSON 解析
data = response.json()
print(data)

带参数的 GET 请求

import requests
 
# 方式1:拼接到URL
response = requests.get("https://api.example.com/users?page=1&size=10")
 
# 方式2:params 参数(推荐)
params = {
    "page": 1,
    "size": 10,
    "sort": "name"
}
response = requests.get("https://api.example.com/users", params=params)

POST 请求

import requests
 
# 表单数据
data = {
    "username": "admin",
    "password": "123456"
}
response = requests.post("https://api.example.com/login", data=data)
 
# JSON 数据
json_data = {
    "name": "张三",
    "age": 18
}
response = requests.post("https://api.example.com/users", json=json_data)

请求头

import requests
 
headers = {
    "User-Agent": "Mozilla/5.0",
    "Authorization": "Bearer token123",
    "Content-Type": "application/json"
}
 
response = requests.get("https://api.example.com/data", headers=headers)

其他请求方法

import requests
 
# PUT 更新
requests.put("https://api.example.com/users/1", json={"name": "新名字"})
 
# DELETE 删除
requests.delete("https://api.example.com/users/1")
 
# PATCH 部分更新
requests.patch("https://api.example.com/users/1", json={"age": 20})

超时和异常处理

import requests
 
try:
    response = requests.get(
        "https://api.example.com/data",
        timeout=10  # 超时时间10秒
    )
    response.raise_for_status()  # 状态码不是2xx就抛异常
    print(response.json())
except requests.exceptions.Timeout:
    print("请求超时")
except requests.exceptions.ConnectionError:
    print("连接失败")
except requests.exceptions.HTTPError as e:
    print(f"HTTP错误:{e}")
except requests.exceptions.RequestException as e:
    print(f"请求异常:{e}")

26.3 常用网络库

urllib(标准库)

Python 内置的 HTTP 库,不用安装,但用起来比较麻烦。

from urllib import request, parse
import json
 
# GET 请求
url = "https://api.example.com/data"
response = request.urlopen(url)
data = response.read().decode()
print(data)
 
# POST 请求
data = parse.urlencode({"name": "张三", "age": 18}).encode()
req = request.Request("https://api.example.com/users", data=data, method="POST")
response = request.urlopen(req)
print(response.read().decode())

aiohttp(异步HTTP)

异步 HTTP 客户端,配合 asyncio 使用。

安装

pip install aiohttp
import aiohttp
import asyncio
 
async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()
 
async def main():
    urls = [
        "https://api.example.com/1",
        "https://api.example.com/2",
        "https://api.example.com/3"
    ]
    tasks = [fetch(url) for url in urls]
    results = await asyncio.gather(*tasks)
    for result in results:
        print(result)
 
asyncio.run(main())

BeautifulSoup(HTML解析)

解析 HTML 页面,用于爬虫。

安装

pip install beautifulsoup4
from bs4 import BeautifulSoup
import requests
 
# 获取页面
response = requests.get("https://www.example.com")
soup = BeautifulSoup(response.text, "html.parser")
 
# 查找元素
title = soup.find("title")
print(title.text)
 
# 查找所有链接
links = soup.find_all("a")
for link in links:
    print(link.get("href"), link.text)
 
# CSS选择器
articles = soup.select(".article-list .article")
for article in articles:
    print(article.h2.text)

26.4 简单爬虫示例

import requests
from bs4 import BeautifulSoup
import time
 
def crawl_quote():
    """爬取名言"""
    url = "https://quotes.toscrape.com/"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
 
    quotes = []
    for quote in soup.select(".quote"):
        text = quote.find(class_="text").text
        author = quote.find(class_="author").text
        tags = [tag.text for tag in quote.select(".tag")]
 
        quotes.append({
            "text": text,
            "author": author,
            "tags": tags
        })
 
    return quotes
 
if __name__ == "__main__":
    quotes = crawl_quote()
    for i, quote in enumerate(quotes, 1):
        print(f"{i}. {quote['text']}")
        print(f"   —— {quote['author']}")
        print()

爬虫注意事项

  • 遵守网站的 robots.txt
  • 不要请求太频繁,加延时
  • 尊重版权和隐私
  • 仅供学习使用

🔗 相关章节


📝 我的笔记

在这里记录你的理解和练习代码

# 你的练习代码
 

✅ 本章检查清单

  • 了解 socket 编程的基本概念
  • 会写简单的 TCP 客户端和服务端
  • 了解 TCP 和 UDP 的区别
  • 熟练使用 requests 库
  • 会发送 GET/POST 请求
  • 会处理请求异常
  • 了解 BeautifulSoup 的基本用法
  • 了解爬虫的基本原理