共计 2743 个字符,预计需要花费 7 分钟才能阅读完成。
Python 的强大不仅在于数据处理和脚本自动化,它还拥有非常方便的网络编程能力。通过 requests 模块,我们可以轻松地与网站交互,获取网页数据或向服务器提交信息。本节将带你了解如何使用 Python 发起 HTTP 请求,这是学习爬虫、API 调用和网络服务开发的基础。
一、HTTP 请求的基本概念
HTTP(超文本传输协议)是互联网通信的核心。客户端(如浏览器或 Python 程序)通过 HTTP 协议与服务器交互,常见的请求方法包括:
- GET:向服务器请求数据(例如访问网页)。
- POST:向服务器提交数据(例如表单、JSON 等)。
- PUT:更新服务器上的资源。
- DELETE:删除服务器上的资源。
Python 的 requests 模块是处理这些请求的利器。
二、安装 requests 模块
如果你尚未安装 requests 模块,可以通过命令行安装:
pip install requests
三、GET 请求
GET 请求是最常见的 HTTP 请求类型,用于从服务器获取资源。
import requests
# 发送 GET 请求
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
# 打印响应状态码和内容
print(" 状态码:", response.status_code)
print(" 响应内容:", response.text)
response.status_code:返回 HTTP 状态码(如 200 表示成功)。response.text:返回响应内容(字符串格式)。
你也可以直接获取 JSON 格式的数据:
data = response.json()
print(" 标题:", data['title'])
print(" 内容:", data['body'])
四、带参数的 GET 请求
有时我们需要在请求中携带参数,例如向搜索接口传递关键词。
params = {"userId": 1}
response = requests.get("https://jsonplaceholder.typicode.com/posts", params=params)
print(" 请求的 URL:", response.url)
print(" 返回的结果数量:", len(response.json()))
通过 params 参数,requests 会自动将字典转为 URL 查询参数。
五、POST 请求
POST 请求用于向服务器提交数据,例如登录表单或上传信息。
import requests
data = {"title": " 学习 Python 网络编程 ", "body": "requests 模块非常方便 ", "userId": 1}
response = requests.post("https://jsonplaceholder.typicode.com/posts", json=data)
print(" 状态码:", response.status_code)
print(" 响应内容:", response.json())
此处使用 json 参数自动将 Python 字典转为 JSON 格式并发送。
六、请求头与响应头
HTTP 请求中常常需要添加自定义头部信息,比如模拟浏览器或提供认证信息。
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept": "application/json"
}
response = requests.get("https://httpbin.org/headers", headers=headers)
print(" 返回的头信息:", response.json())
同样,响应中也包含许多有用信息:
print(" 响应头:", response.headers)
七、处理网络异常
网络请求可能因超时、连接失败等原因出错。我们可以使用 try-except 块进行异常处理。
import requests
try:
response = requests.get("https://nonexistent.example.com", timeout=5)
response.raise_for_status() # 检查状态码是否为 200
except requests.exceptions.Timeout:
print(" 请求超时,请检查网络!")
except requests.exceptions.RequestException as e:
print(" 请求失败:", e)
timeout 参数用于防止请求无限等待,raise_for_status() 会在响应非 200 时抛出异常。
八、下载文件示例
我们可以使用 requests 来下载文件,例如图片或文档。
url = "https://www.example.com/image.jpg"
response = requests.get(url)
if response.status_code == 200:
with open("downloaded.jpg", "wb") as f:
f.write(response.content)
print(" 文件下载完成!")
使用 response.content 可以获取二进制内容,适合图片、PDF 等文件。
九、提交表单与文件上传
如果网站需要表单提交或文件上传,也可以通过 requests 模块轻松实现。
# 表单数据提交
data = {"username": "admin", "password": "123456"}
response = requests.post("https://httpbin.org/post", data=data)
print(response.json())
# 文件上传
files = {"file": open("example.txt", "rb")}
response = requests.post("https://httpbin.org/post", files=files)
print(response.json())
requests 会自动为表单和文件添加正确的 Content-Type 头信息。
十、总结
通过 requests 模块,我们可以轻松完成各种网络请求操作:
- 使用
get()获取网页数据; - 使用
post()提交表单或 JSON 数据; - 设置请求头 headers 模拟浏览器;
- 使用异常处理应对网络问题;
- 下载或上传文件。
网络编程是 Python 的重要应用场景之一,掌握 HTTP 请求的使用,可以帮助你快速进入 Web 爬虫、API 调用和自动化测试等领域。
练习与思考:
- 使用
requests获取一个公开 API(如天气、新闻)并解析 JSON 数据。 - 模拟浏览器访问百度首页,并保存 HTML 源代码。
- 编写一个下载器,能批量下载多个图片并保存到指定目录。