【Python】网络请求与数据获取:Requests库的使用与技巧


网络请求与数据获取:Requests 库的使用与技巧

在现代 Web 开发与数据科学工作中,从 API、网页或服务端获取数据是非常常见的任务,而 Python 的 Requests 库为此提供了便捷且功能强大的工具。本文将从基本的 HTTP 请求操作出发,结合常见的数据获取需求,深入讲解 Requests 的使用技巧,让您更高效地实现网络数据获取任务。

一、Requests 库简介

Requests 是 Python 中广泛使用的 HTTP 请求库之一,它的设计哲学是简单优雅,让开发者能够快速发起 HTTP 请求。通过 Requests,您可以轻松地发送 GET、POST、PUT、DELETE 等请求,并获得结构化的响应数据。

安装 Requests

在使用 Requests 之前,需要通过以下命令进行安装:

pip install requests

二、基础用法

1. 发送 GET 请求

最基本的请求是 GET 请求,用于从服务器获取数据。通过 requests.get() 可以直接发送 GET 请求并获取响应内容。

import requests

url = 'https://jsonplaceholder.typicode.com/posts'
response = requests.get(url)

# 打印响应状态码
print(response.status_code)

# 打印返回的 JSON 数据
print(response.json())
  • response.status_code:返回响应的状态码,200 表示成功,404 表示未找到等。
  • response.json():将 JSON 响应转换为 Python 字典。
  • 2. 发送 POST 请求

    POST 请求一般用于提交数据。通过 requests.post() 可以传入数据发送 POST 请求。

    data = {'title': 'foo', 'body': 'bar', 'userId': 1}
    response = requests.post(url, json=data)
    
    print(response.status_code)
    print(response.json())
    

    三、请求参数与 Headers 设置

    在真实应用中,HTTP 请求往往需要带有请求参数或自定义的请求头,Requests 提供了便捷的方法来实现。

    1. URL 请求参数

    在 GET 请求中,可以通过 params 参数传递查询参数,Requests 会自动将其编码为 URL 的查询字符串。

    params = {'userId': 1}
    response = requests.get(url, params=params)
    
    print(response.url)  # https://jsonplaceholder.typicode.com/posts?userId=1
    print(response.json())
    

    2. 请求 Headers

    通过 headers 参数设置自定义的请求头,例如伪装成浏览器或指定 API 的认证密钥。

    headers = {'User-Agent': 'Mozilla/5.0', 'Authorization': 'Bearer YOUR_API_TOKEN'}
    response = requests.get(url, headers=headers)
    
    print(response.json())
    

    3. 发送带有 Cookie 的请求

    如果需要登录或保持会话,可以使用 cookies 参数来传递 Cookie。

    cookies = {'session_id': '123456789'}
    response = requests.get(url, cookies=cookies)
    
    print(response.json())
    

    四、文件上传与下载

    1. 文件上传

    通过 POST 请求上传文件,可以使用 files 参数。

    file_path = 'path/to/your/file.txt'
    files = {'file': open(file_path, 'rb')}
    response = requests.post(url, files=files)
    
    print(response.status_code)
    print(response.json())
    

    2. 文件下载

    获取文件数据并将其保存到本地文件,适用于下载图片、PDF 文件等。

    file_url = 'https://example.com/image.jpg'
    response = requests.get(file_url)
    
    with open('downloaded_image.jpg', 'wb') as file:
        file.write(response.content)
    

    response.content 返回字节内容,可以直接写入二进制文件。

    五、处理超时和重试

    网络请求中经常会遇到超时或连接失败等问题。Requests 提供了超时参数 timeout 和重试机制来更好地处理这些情况。

    1. 设置请求超时

    设置 timeout 可以避免请求长时间挂起,timeout 参数接受秒数作为值:

    try:
        response = requests.get(url, timeout=5)
        print(response.json())
    except requests.exceptions.Timeout:
        print("请求超时,请检查网络或服务状态")
    

    2. 使用重试机制

    在一些网络不稳定或服务偶尔会失败的情况下,可以使用 requests.adapters.HTTPAdapter 配合 Retry 实现自动重试。

    from requests.adapters import HTTPAdapter, Retry
    
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=0.2, status_forcelist=[500, 502, 503, 504])
    session.mount('http://', HTTPAdapter(max_retries=retries))
    
    response = session.get(url)
    print(response.status_code)
    
  • total=5:重试次数为 5 次。
  • backoff_factor=0.2:重试间隔时间倍增,形成指数退避。
  • status_forcelist:设置哪些 HTTP 状态码触发重试。
  • 六、Session 会话保持

    Requests 提供了 Session 对象,可以保持会话状态,比如自动保存并携带 Cookie 以实现登录后连续访问。

    session = requests.Session()
    
    # 第一次请求登录,保存登录后的 Cookie
    login_data = {'username': 'user', 'password': 'pass'}
    session.post('https://example.com/login', data=login_data)
    
    # 第二次请求访问需要登录的页面
    response = session.get('https://example.com/dashboard')
    print(response.json())
    

    使用 Session 后,第二次请求会自动携带登录后的 Cookie 和会话信息,便于后续访问。

    七、SSL 证书验证与代理设置

    1. 忽略 SSL 证书验证

    在请求 HTTPS 时,可以通过 verify=False 忽略 SSL 证书,适用于本地测试或不需要验证证书的场景:

    response = requests.get(url, verify=False)
    

    ⚠️ 注意:忽略 SSL 证书存在安全风险,不推荐在生产环境使用。

    2. 设置代理

    通过代理访问网络,适用于网络封锁、限流等场景。

    proxies = {
        'http': 'http://10.10.1.10:3128',
        'https': 'https://10.10.1.10:1080',
    }
    response = requests.get(url, proxies=proxies)
    print(response.json())
    

    八、处理复杂 JSON 响应

    当接口返回的 JSON 数据较为复杂时,可以使用 Python 的字典和列表操作对其进行解析。

    response = requests.get(url)
    data = response.json()
    
    # 假设 data 是一个包含嵌套数据的字典
    for item in data['items']:
        print(f"ID: {item['id']}, Name: {item['name']}")
    

    在处理复杂数据时,熟练掌握字典和列表的解析方法,可以有效提取有用信息。

    总结

    Requests 是一个功能强大且简单易用的 HTTP 请求库,在数据获取与接口请求中提供了极大的便利。本文介绍了 Requests 的基础操作和多种高级用法,包括请求参数、文件处理、超时重试、会话保持等技巧,能够帮助您轻松应对不同的网络请求场景。在掌握这些内容后,您就可以利用 Requests 库高效地获取和处理网络数据,为开发自动化数据采集、接口调用等任务提供支持。

    作者:萧鼎

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python】网络请求与数据获取:Requests库的使用与技巧

    发表回复