自学内容网 自学内容网

python爬虫 - 深入requests模块

  🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

​编辑

前言

一、下载网络文件

(一)基本步骤

(二)分段下载大文件

(三)常见问题

二、requests模块处理Cookie

(一)发送带有 Cookies 的请求

(二)从响应中获取 Cookies

(三)Session 对象管理 Cookies

(四)手动设置和修改 Cookies

(五)RequestsCookieJar 转换为字典

(六)字典转换为 RequestsCookieJar

(七)总结

三、重定向与历史请求

(一)重定向的概念

(二)自动重定向

(三)禁止重定向

(四)POST 请求的重定向

(五)重定向链和历史请求

(六)限制重定向次数

(七)总结

四、总结


前言

本文主要介绍了如何使用 Python 的 requests 模块进行网络请求操作,涵盖了从文件下载、Cookie 处理到重定向与历史请求等多个方面。通过详细的示例代码,展示了如何高效地实现各种网络操作,帮助开发者更轻松地进行 HTTP 请求的处理和数据管理。


一、下载网络文件

(一)基本步骤

使用 requests.get() 方法可以发送 HTTP GET 请求,从给定的 URL 下载文件。以下是下载文件的典型步骤:

  1. 发送请求 使用 requests.get() 向文件的 URL 发送请求。

  2. 获取文件内容 响应对象的 content 属性包含文件的二进制数据,可以将其保存到本地文件中。

  3. 保存文件 使用 with open() 创建一个本地文件,将下载的内容写入其中。

示例:

import requests

# 要下载的文件的 URL
url = 'https://example.com/sample.pdf'

# 发送 GET 请求
response = requests.get(url)

# 检查请求是否成功
if response.status_code == 200:
    # 以二进制模式打开一个文件,将文件内容写入本地
    with open('sample.pdf', 'wb') as file:
        file.write(response.content)
    print("文件下载成功")
else:
    print(f"文件下载失败,状态码:{response.status_code}")

(二)分段下载大文件

如果文件比较大,建议使用分段下载方式。通过 iter_content() 方法,可以避免将整个文件一次性加载到内存中,而是逐块处理数据,适合大文件下载。

示例:

import requests

# 要下载的文件的 URL
url = 'https://example.com/largefile.zip'

# 发送 GET 请求,流式获取文件
response = requests.get(url, stream=True)

# 检查请求是否成功
if response.status_code == 200:
    # 以二进制模式打开一个文件,逐块写入数据
    with open('largefile.zip', 'wb') as file:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:  # 过滤掉保持活动的空数据块
                file.write(chunk)
    print("大文件下载成功")
else:
    print(f"文件下载失败,状态码:{response.status_code}")

(三)常见问题

常见的问题主要有两个:

1. 超时设置:可以使用 timeout 参数来避免请求长时间挂起。例如:

response = requests.get(url, timeout=10)  # 设置10秒超时

2. 错误处理:建议添加异常处理来捕获网络错误。例如:

try:
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
except requests.exceptions.RequestException as e:
    print(f"请求失败:{e}")

二、requests模块处理Cookie

requests 模块可以轻松地处理 HTTP 请求中的 Cookies,包括发送带有 Cookie 的请求和在响应中获取 Cookie。以下是如何使用 requests 模块处理 Cookies 的一些常见方法和操作示例。

(一)发送带有 Cookies 的请求

在发送请求时,可以通过 cookies 参数向服务器发送 Cookie。这个参数接收一个字典形式的 Cookie 数据,其中键是 Cookie 名称,值是 Cookie 的值。

示例:

import requests

# 定义 Cookies
cookies = {
    'session_id': '123456',
    'user': 'john_doe'
}

# 发送带有 Cookies 的请求
response = requests.get('https://example.com', cookies=cookies)

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

在这个示例中,session_id 和 user 是发送给服务器的 Cookie。

(二)从响应中获取 Cookies

服务器在响应中也可以返回 Set-Cookie 头,requests 模块会自动将这些 Cookie 存储在 response.cookies 属性中。

示例:

import requests

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

# 获取响应中的 Cookies
cookies = response.cookies

# 遍历 Cookies
for cookie in cookies:
    print(f"{cookie.name}: {cookie.value}")

response.cookies 是一个 RequestsCookieJar 对象,类似于字典,可以像访问字典那样访问特定的 Cookie。

(三)Session 对象管理 Cookies

使用 requests.Session() 对象时,Cookies 会自动在不同的请求之间保存和发送。这在处理需要登录认证的情况时非常有用,因为 Session 对象可以自动保持会话的状态。

示例:

import requests

# 创建一个 Session 对象
session = requests.Session()

# 第一次请求,可能会设置 Cookies(例如登录)
response = session.get('https://example.com/login')

# 在后续的请求中,Cookies 会自动发送
response = session.get('https://example.com/dashboard')

# 查看当前 Session 中的 Cookies
print(session.cookies)

在这个示例中,session 对象会自动管理从响应中接收到的 Cookies,并在后续请求中发送它们。这样,可以保持一个会话(如登录后的状态)。

(四)手动设置和修改 Cookies

如果想手动管理 Session 对象的 Cookies,可以通过 session.cookies.set() 方法来设置或修改 Cookies。

示例:

import requests

# 创建一个 Session 对象
session = requests.Session()

# 设置一个新的 Cookie
session.cookies.set('my_cookie', 'cookie_value')

# 发送请求,并自动附带这个 Cookie
response = session.get('https://example.com')

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

(五)RequestsCookieJar 转换为字典

response.cookies 返回的是一个 RequestsCookieJar 对象,可以将其转换为一个普通的字典,便于后续处理。

示例:

# 将 Cookies 转换为字典
cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)

print(cookies_dict)

(六)字典转换为 RequestsCookieJar

可以将一个字典转换为 RequestsCookieJar,这样可以方便地管理 Cookie。

示例:

from requests.cookies import cookiejar_from_dict

# 定义 Cookies 字典
cookies_dict = {'session_id': '123456', 'user': 'john_doe'}

# 将字典转换为 RequestsCookieJar
jar = cookiejar_from_dict(cookies_dict)

# 发送请求时使用这个 CookieJar
response = requests.get('https://example.com', cookies=jar)

(七)总结

  • 发送 Cookie: 通过 cookies 参数传递字典。

  • 获取 Cookie: 通过 response.cookies 获取服务器返回的 Cookie。

  • 自动管理 Cookie: 使用 requests.Session() 可以在多个请求间自动管理 Cookie。

  • 手动设置和修改: 通过 session.cookies.set() 手动设置 Cookies。

  • 转换 CookieJar 和字典: requests.utils.dict_from_cookiejar()requests.cookies.cookiejar_from_dict() 方法可以互相转换。


三、重定向与历史请求

重定向 和 历史请求 是常见的网络请求处理需求。requests 模块默认会自动处理 HTTP 重定向,并且提供了查看重定向历史的功能。

(一)重定向的概念

重定向是指服务器告诉客户端当前请求的资源已经移动到另一个 URL,客户端需要访问新的 URL。常见的重定向状态码包括:

  • 301 Moved Permanently: 永久重定向,资源已永久搬迁到新的 URL。

  • 302 Found: 临时重定向,资源临时搬迁,但客户端应继续使用原始 URL。

  • 303 See Other: 告诉客户端请求的资源可以在另一个 URL 处使用 GET 请求获取。

  • 307 Temporary Redirect: 请求资源临时搬迁,客户端应保留请求方法和数据。

  • 308 Permanent Redirect: 类似于 301,但客户端必须使用相同的请求方法。

(二)自动重定向

requests 模块默认会自动处理重定向。如果服务器返回一个 3xx 响应,requests 会跟随 Location 头中的新 URL 进行重定向。你可以通过 response.history 查看重定向链中的所有请求。

示例:

import requests

# 发送一个可能发生重定向的请求
response = requests.get('http://example.com')

# 打印最终响应的 URL
print(f"最终的 URL: {response.url}")

# 检查重定向历史
if response.history:
    print("发生了重定向")
    for resp in response.history:
        print(f"状态码: {resp.status_code}, URL: {resp.url}")
else:
    print("没有发生重定向")

在这个例子中,response.history 是一个包含重定向历史的列表,包含每次重定向的响应对象,最终的响应会保存在 response 中。

(三)禁止重定向

如果不希望自动跟随重定向,可以通过 allow_redirects=False 禁用重定向。在这种情况下,requests 会返回重定向响应,但不会继续跟随。

示例:

import requests

# 禁止自动重定向
response = requests.get('http://example.com', allow_redirects=False)

# 查看响应状态码和重定向的 URL
print(f"状态码: {response.status_code}")
if response.is_redirect or response.status_code in [301, 302, 303, 307, 308]:
    print(f"重定向的 URL: {response.headers['Location']}")

如果服务器返回重定向状态码(如 301 或 302),Location 头部中将包含重定向的新 URL,requests 将返回此信息而不会自动发起新的请求。

(四)POST 请求的重定向

当发送 POST 请求时,如果遇到 302 或 303 重定向,requests 会自动将方法更改为 GET,以符合 HTTP 规范。

示例:

import requests

# 发送一个 POST 请求,并触发重定向
response = requests.post('http://example.com/login', data={'username': 'user', 'password': 'pass'})

# 打印重定向后的请求方法
if response.history:
    print(f"重定向后使用的请求方法: {response.request.method}")

在这种情况下,POST 请求可能会被重定向为 GET 请求。

(五)重定向链和历史请求

可以通过 response.history 来查看每一次重定向的状态码和 URL,以跟踪整个请求链。

示例:

import requests

# 发送一个可能发生多次重定向的请求
response = requests.get('http://example.com')

# 打印重定向链中的每个请求信息
for resp in response.history:
    print(f"状态码: {resp.status_code}, URL: {resp.url}, 请求方法: {resp.request.method}")

(六)限制重定向次数

requests 模块默认允许最多 30 次重定向。如果需要限制重定向次数,可以通过 max_redirects 参数来控制。

示例:

import requests

# 限制最多重定向次数为 5
response = requests.get('http://example.com', max_redirects=5)

# 查看响应状态码
print(f"最终的状态码: {response.status_code}")

如果重定向次数超过了设置的限制,requests 会抛出 TooManyRedirects 异常。

(七)总结

  • 自动重定向: requests 默认会自动处理 3xx 重定向,并可通过 response.history 查看重定向链。

  • 禁止重定向: 使用 allow_redirects=False 禁止自动重定向。

  • POST 请求重定向: 如果遇到 302 或 303 状态码,POST 请求会自动转换为 GET 请求。

  • 历史请求: 通过 response.history 获取每次重定向的状态码、URL 和请求方法,了解请求过程。

  • 限制重定向次数: 可以通过 max_redirects 限制最大重定向次数,防止陷入无限重定向循环。


四、总结

通过 requests 模块,开发者可以轻松实现文件下载、Cookie 自动管理以及处理重定向和历史请求。本文通过清晰的步骤和代码示例,展示了如何处理常见的网络请求需求,并提供了应对大文件下载、请求超时及多次重定向等复杂场景的解决方案,使网络编程变得更加简单和高效。


原文地址:https://blog.csdn.net/2401_86688088/article/details/142678932

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!