今天我们将深入探讨如何使用Requests库高效地获取网页数据。Requests库是一个功能强大且易于使用的HTTP客户端库,特别适合用于发送HTTP请求和处理响应。我们将通过解析requests.get和requests.post的核心参数、讲解超时设置与异常处理、探讨文件下载与流式传输,并通过一个批量下载图片的案例来加深理解。

一、requests.get/post核心参数解析

requests.get

requests.get()函数用于发送GET请求。其核心参数包括:

  • url:请求对象的URL地址。
  • params(可选):使用字典作为GET请求的参数。
  • headers(可选):使用字典作为GET请求的headers信息。
  • cookies(可选):使用CookieJar对象发送GET请求。
  • auth(可选):AuthObject启用基本HTTP身份验证。
  • timeout(可选):请求超时的设置,用浮点数表示。
requests.post
  • requests.post()函数用于发送POST请求。其核心参数包括:
  • url:要发送POST请求的目标URL。
  • data(可选):要发送的数据,可以是字典、元组列表或字节流。
  • json(可选):要发送的JSON数据。如果设置了json参数,则data参数将被忽略。
  • headers(可选):要发送的HTTP头部信息。
  • params(可选):要发送的URL参数。
  • auth(可选):用于进行身份验证的参数。
  • timeout(可选):请求超时时间。
  • proxies(可选):用于发送请求的代理服务器。
  • verify(可选):是否验证服务器的SSL证书。
  • files(可选):要上传的文件。

二、超时设置与异常处理

在网络通信中,由于网络状况的不稳定性,请求可能会因为各种原因(如网络延迟、服务器响应慢、网络中断等)而无法及时得到响应。为了应对这种情况,requests库提供了超时设置功能,并通过异常处理机制帮助开发者处理各种网络错误和异常情况。

超时设置

在requests库中,设置超时非常简单,只需要在发起请求时指定timeout参数即可。timeout参数的值是一个浮点数(或元组),表示等待服务器响应的最长时间(以秒为单位)。如果请求在指定的时间内没有收到响应,则会抛出一个Timeout异常。

异常处理

requests库在发生异常时,会抛出相应的异常类型。为了捕获并处理这些异常,我们可以使用Python的try-except语句块。常见的异常类型包括ConnectionError、HTTPError、Timeout等。

import requests
 
try:
    # 发起HTTP GET请求,并设置超时时间为5秒
    response = requests.get('https://www.baidu.com', timeout=5)
    # 检查请求是否成功
    response.raise_for_status()
    # 打印响应内容
    print(response.text)
except requests.exceptions.Timeout:
    # 捕捉超时异常
    print("-------------- timeout")
except requests.exceptions.RequestException as e:
    # 捕捉其他请求异常
    print(f"-------------- request exception {e}")

三、文件下载与流式传输

requests库不仅可以用于获取网页数据,还可以用于下载文件。对于大文件的下载,流式传输是一种高效的方式,因为它可以边下载边保存,避免占用过多内存。

普通下载

对于小文件,可以直接使用Response对象的content属性以字节的方式访问请求响应体,并将其写入文件。

import requests
import os

if not os.path.exists('images-dir'):
    os.makedirs('images-dir')

def get_img():
    try:
        response = requests.get("https://www.域名.com/test-dir/test-img/Nginx使用图片.jpeg", verify=False,timeout=10)
        response.raise_for_status()
        with open(os.path.join('images-dir', 'single-img.jpeg'), 'wb') as file:
            file.write(response.content)
    except requests.exceptions as e:
        print('-------------------- error')
        print(e)

if __name__ == '__main__':
    get_img()
流式传输

对于大文件,可以使用流式传输的方式。通过设置stream=True参数,可以逐块读取响应内容,并将其写入文件。

import requests
import os

if not os.path.exists('images-dir'):
    os.makedirs('images-dir')

def get_zip():
    url = 'https://www.域名.com/test-dir/test-package.zip'
    try:
        response = requests.get(url, stream=True, timeout=60)
        response.raise_for_status()
        with open(os.path.join('images-dir', 'test-zip.zip'), 'wb') as file:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:
                    file.write(chunk)
        print('----------------------- success')
    except requests.exceptions as e:
        print('----------------------- exception')
        print(e)

if __name__ == '__main__':
    get_zip()

四、案例:批量下载图片

下面是一个批量下载图片的案例。假设我们有一个包含多个图片URL的列表,我们需要将这些图片下载到本地。

通过这个案例,我们展示了如何使用Requests库批量下载图片,并处理了可能的异常情况。

import requests
import os

img_list = [
    "https://www.域名.com/test-dir/test-img/Nginx使用图片.jpeg",
    "https://www.域名.com/test-dir/test-img/NodeJS课程.png",
    "https://www.域名.com/test-dir/test-img/Nodejs爬虫图片.jpeg",
    "https://www.域名.com/test-dir/test-img/Python 爬虫课程图片.png",
    "https://www.域名.com/test-dir/test-img/Ubuntu服务器图片.jpeg",
    "https://www.域名.com/test-dir/test-img/puppeteer使用图片.png",
    "https://www.域名.com/test-dir/test-img/python爬虫图片.jpeg",
    "https://www.域名.com/test-dir/test-img/粟德明横向名片.png"
]
if not os.path.exists('images-multiple'):
    os.makedirs('images-multiple')

def loop_img():
    for i, url in enumerate(img_list):
        print(f'------------------------ 开始处理{i + 1}张图片')
        try:
            response = requests.get(url, timeout=5)
            response.raise_for_status()
            # 对图片的后缀进行处理
            strs = url.split('.')
            file_name = 'test-' + str(i + 1) + '.' + strs[len(strs) - 1]
            with open(os.path.join('images-multiple', file_name), 'wb') as file:
                file.write(response.content)
        except requests.exceptions.Timeout:
            # 捕捉超时异常
            print('------------------------- timeout')
        except requests.exceptions.RequestException as e:
            # 捕捉其他请求异常
            print('------------------------- request exception')
            print(e)

if __name__ == '__main__':
    loop_img()

结束语

在本篇博客文章中,我们深入探讨了Requests库的使用,包括requests.getrequests.post的核心参数解析、超时设置与异常处理、文件下载与流式传输,以及一个批量下载图片的案例。希望这些内容能够帮助你更高效地使用Requests库获取网页数据。如果你有任何问题或建议,欢迎在评论区留言!

关注我!!🫵 持续为你带来Python爬虫相关内容。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐