Python Requests模块简介

Requests 是 Python 中一个优雅而简单的 HTTP 库,专门为人类设计。它允许你发送 HTTP/1.1 请求,无需手动添加查询字符串到 URL,或表单编码 POST 数据。

注意: 在开始使用 Requests 之前,需要先安装它。可以使用 pip 命令:pip install requests

基本用法

发送 GET 请求

GET 请求是最常见的 HTTP 请求类型,用于从服务器获取数据。

import requests

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

# 检查请求是否成功
if response.status_code == 200:
    print('请求成功!')
    print('响应内容:', response.text)
else:
    print('请求失败,状态码:', response.status_code)

发送 POST 请求

POST 请求通常用于向服务器提交数据,如表单数据。

import requests

# 准备要发送的数据
data = {
    'username': 'testuser',
    'password': 'testpass'
}

# 发送 POST 请求
response = requests.post('https://httpbin.org/post', data=data)

# 查看响应
print('状态码:', response.status_code)
print('响应内容:', response.json())

请求参数

在发送请求时,可以传递各种参数来定制请求。

URL 参数

可以使用 params 参数传递 URL 查询参数。

import requests

# 定义 URL 参数
params = {
    'key1': 'value1',
    'key2': 'value2'
}

# 发送带参数的 GET 请求
response = requests.get('https://httpbin.org/get', params=params)

print('请求的 URL:', response.url)
print('响应内容:', response.json())

请求头

可以使用 headers 参数设置请求头。

import requests

# 定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Accept': 'application/json'
}

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

print('响应内容:', response.json())

处理响应

Requests 提供了多种方式来处理服务器响应。

响应内容

可以使用不同的属性获取响应内容:

import requests

response = requests.get('https://api.github.com')

# 获取响应文本内容
print('文本内容:', response.text)

# 获取二进制内容
print('二进制内容:', response.content)

# 获取 JSON 内容(如果响应是 JSON 格式)
print('JSON 内容:', response.json())

# 获取原始响应
print('原始响应:', response.raw)

响应状态码和头信息

import requests

response = requests.get('https://api.github.com')

# 获取状态码
print('状态码:', response.status_code)

# 获取响应头
print('响应头:', response.headers)

# 获取特定响应头
print('Content-Type:', response.headers.get('Content-Type'))

注意: 在实际应用中,应该总是检查状态码,确保请求成功后再处理响应内容。

高级功能

会话对象

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

import requests

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

# 设置会话级别的参数
session.headers.update({'User-Agent': 'MyApp/1.0'})

# 使用会话发送请求
response1 = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
response2 = session.get('https://httpbin.org/cookies')

print('第二个请求的 cookies:', response2.json())

超时设置

可以为请求设置超时时间,避免长时间等待。

import requests

try:
    # 设置超时时间为 3 秒
    response = requests.get('https://httpbin.org/delay/5', timeout=3)
    print('请求成功')
except requests.exceptions.Timeout:
    print('请求超时')

错误处理

Requests 提供了多种异常类来处理不同类型的错误。

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

try:
    response = requests.get('https://httpbin.org/status/404', timeout=5)
    response.raise_for_status()  # 如果状态码不是 200,将抛出 HTTPError 异常
except Timeout:
    print('请求超时')
except ConnectionError:
    print('连接错误')
except HTTPError as e:
    print(f'HTTP 错误: {e}')
else:
    print('请求成功')

实际应用示例

获取网页内容并提取信息

import requests
from bs4 import BeautifulSoup

# 获取网页内容
response = requests.get('https://httpbin.org/html')

# 检查请求是否成功
if response.status_code == 200:
    # 使用 BeautifulSoup 解析 HTML
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 提取标题
    title = soup.find('h1')
    if title:
        print('页面标题:', title.get_text())
else:
    print('请求失败,状态码:', response.status_code)

下载文件

import requests

# 下载文件
url = 'https://httpbin.org/image/jpeg'
response = requests.get(url, stream=True)

# 检查请求是否成功
if response.status_code == 200:
    # 以二进制模式打开文件
    with open('image.jpg', 'wb') as f:
        # 分块写入文件
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)
    print('文件下载完成')
else:
    print('下载失败,状态码:', response.status_code)