第106集 requests库基础

学习目标

  • 了解requests库的基本概念和特点
  • 掌握requests库的安装方法
  • 学会发送GET请求并处理响应
  • 学会发送POST请求并提交数据
  • 掌握请求参数、请求头、Cookie的设置方法
  • 学会处理响应内容和状态码
  • 了解基本的错误处理方法

一、requests库概述

1. 什么是requests库

requests是Python中用于发送HTTP请求的第三方库,它提供了简洁易用的API,使得发送HTTP请求变得非常方便。requests库是Python开发者最常用的HTTP客户端库之一。

2. requests库的特点

  • 简洁易用:提供了直观的API,比Python标准库中的urllib更加方便
  • 功能强大:支持各种HTTP方法、请求参数、请求头、Cookie、会话等
  • 自动处理编码:自动处理响应内容的编码
  • 连接池支持:提高了性能
  • SSL验证:支持HTTPS
  • 国际化域名和URL:支持国际化的域名和URL

3. 安装requests库

在命令行中使用pip安装requests库:

pip install requests

安装完成后,可以在Python中导入requests库:

import requests

二、发送GET请求

GET请求是最常用的HTTP请求方法,用于从服务器获取资源。

1. 基本的GET请求

import requests

# 发送GET请求
response = requests.get('https://www.example.com')

# 打印响应内容
print(response.text)

2. 带参数的GET请求

可以通过params参数传递查询参数:

import requests

# 定义查询参数
data = {
    'name': '张三',
    'age': 25
}

# 发送带参数的GET请求
response = requests.get('https://www.example.com/api/users', params=data)

# 打印请求URL
print(response.url)  # 输出: https://www.example.com/api/users?name=张三&age=25

# 打印响应内容
print(response.text)

3. 自定义请求头

可以通过headers参数设置请求头:

import requests

# 定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    'Accept-Language': 'zh-CN,zh;q=0.9'
}

# 发送带自定义请求头的GET请求
response = requests.get('https://www.example.com', headers=headers)

# 打印响应内容
print(response.text)

三、发送POST请求

POST请求用于向服务器提交数据,例如表单提交、上传文件等。

1. 基本的POST请求

import requests

# 定义要提交的数据
data = {
    'username': 'admin',
    'password': '123456'
}

# 发送POST请求
response = requests.post('https://www.example.com/login', data=data)

# 打印响应内容
print(response.text)

2. 提交JSON数据

如果需要提交JSON格式的数据,可以使用json参数:

import requests

# 定义要提交的JSON数据
json_data = {
    'name': '张三',
    'age': 25,
    'email': 'zhangsan@example.com'
}

# 发送POST请求,提交JSON数据
response = requests.post('https://www.example.com/api/users', json=json_data)

# 打印响应内容
print(response.text)

3. 上传文件

可以使用files参数上传文件:

import requests

# 定义要上传的文件
files = {
    'file': open('example.txt', 'rb')
}

# 发送POST请求,上传文件
response = requests.post('https://www.example.com/upload', files=files)

# 打印响应内容
print(response.text)

四、处理响应

requests库的响应对象包含了服务器返回的所有信息。

1. 响应状态码

import requests

response = requests.get('https://www.example.com')

# 获取响应状态码
print(response.status_code)  # 输出: 200

# 判断请求是否成功
if response.status_code == 200:
    print('请求成功')
else:
    print('请求失败')

2. 响应头

import requests

response = requests.get('https://www.example.com')

# 获取所有响应头
print(response.headers)

# 获取特定响应头
print(response.headers['Content-Type'])  # 输出: text/html; charset=UTF-8

3. 响应内容

import requests

response = requests.get('https://www.example.com')

# 获取响应内容(字符串)
print(response.text)

# 获取响应内容(字节)
print(response.content)

# 获取响应内容(JSON格式,自动解析)
# 注意:只有响应内容是JSON格式时才能使用
print(response.json())

4. Cookie信息

import requests

response = requests.get('https://www.example.com')

# 获取Cookie信息
print(response.cookies)

# 获取特定Cookie值
print(response.cookies.get('session_id'))

五、会话管理

会话对象可以在多个请求之间保持某些参数,例如Cookie。

import requests

# 创建会话对象
session = requests.Session()

# 发送第一个请求,登录系统
login_data = {
    'username': 'admin',
    'password': '123456'
}
session.post('https://www.example.com/login', data=login_data)

# 发送第二个请求,访问需要登录的页面
response = session.get('https://www.example.com/dashboard')

# 打印响应内容
print(response.text)

六、超时设置

可以通过timeout参数设置请求的超时时间:

import requests

# 设置超时时间为5秒
try:
    response = requests.get('https://www.example.com', timeout=5)
    print(response.text)
except requests.exceptions.Timeout:
    print('请求超时')
except requests.exceptions.RequestException as e:
    print(f'请求发生错误: {e}')

七、SSL证书验证

requests库默认会验证HTTPS请求的SSL证书。如果需要忽略证书验证,可以设置verify参数为False:

import requests

# 忽略SSL证书验证
response = requests.get('https://www.example.com', verify=False)
print(response.text)

注意:在生产环境中,不建议忽略SSL证书验证,这会带来安全风险。

八、错误处理

requests库提供了多种异常类,可以用于处理不同类型的错误:

import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout

try:
    response = requests.get('https://www.example.com')
    
    # 检查响应状态码,如果不是200,抛出HTTPError异常
    response.raise_for_status()
    
    print(response.text)
except HTTPError as e:
    print(f'HTTP错误: {e}')
except ConnectionError as e:
    print(f'连接错误: {e}')
except Timeout as e:
    print(f'超时错误: {e}')
except RequestException as e:
    print(f'请求错误: {e}')

九、实际应用示例

1. 获取网页内容

import requests

# 发送GET请求获取网页内容
response = requests.get('https://www.python.org')

# 打印网页标题
if response.status_code == 200:
    # 简单提取标题(实际应用中应使用解析库)
    content = response.text
    start = content.find('<title>') + 7
    end = content.find('</title>')
    title = content[start:end]
    print(f'网页标题: {title}')
else:
    print(f'请求失败,状态码: {response.status_code}')

2. 调用API接口

import requests

# 调用JSONPlaceholder API
authors = {
    'name': 'John Doe',
    'email': 'john@example.com',
    'password': 'secret123'
}

# 注册用户
response = requests.post('https://jsonplaceholder.typicode.com/users', json=authors)

if response.status_code == 201:
    print('注册成功')
    user_data = response.json()
    print(f'用户ID: {user_data["id
« 上一篇 HTTP协议基础 下一篇 » requests库高级用法