Python requests库

Python requests 库使用

1. 基本用法

1.1 发送 GET 请求

import requests

response = requests.get('https://example.com')
print(response.status_code)  # HTTP 状态码
print(response.text)  # 响应内容

1.2 发送 POST 请求

import requests

data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://example.com/api', data=data)
print(response.status_code)
print(response.json())  # 如果响应是JSON格式

1.3 使用 json 参数发送 JSON 数据

import requests

json_data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://example.com/api', json=json_data)
print(response.status_code)
print(response.json())

1.4 自定义请求头

headers = {'User-Agent': 'my-app/0.0.1'}
response = requests.get('https://example.com', headers=headers)
print(response.status_code)

1.5 发送带参数的 GET 请求

params = {'q': 'python', 'page': 2}
response = requests.get('https://example.com/search', params=params)
print(response.url)  # 完整的 URL,包括参数

1.6 文件上传

files = {'file': open('report.txt', 'rb')}
response = requests.post('https://example.com/upload', files=files)
print(response.status_code)

2. 响应处理

  • response.text: 返回响应的文本内容。
  • response.json(): 将响应内容作为 JSON 解析。
  • response.content: 返回二进制响应内容,适用于下载文件等情况。

3. 进阶用法

3.1 流式请求

适用于处理大文件下载。

response = requests.get('https://example.com/largefile', stream=True)
with open('largefile', 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024):
        if chunk:
            f.write(chunk)

3.2 超时控制

response = requests.get('https://example.com', timeout=5)

3.3 会话保持

会话保持(Session Persistence)指的是在多个请求之间保存会话信息,以便能够持续共享如 cookies、认证信息等状态。通常情况下,每次发送 HTTP 请求时,服务器会视每个请求为独立的,即使请求来自同一客户端,服务器默认不会跟踪之前的请求状态。

为什么需要会话保持?

在某些情况下,你需要多个请求共享相同的状态。例如,登录后的请求可能依赖于会话中的 cookies 来保持用户的登录状态。如果每个请求都是独立的,那么你每次都需要重新登录。

通过会话保持,多个请求之间可以共享一些信息,比如:

  • Cookies:用于认证的会话 cookie,可以跨多个请求保持。
  • 请求头(Headers):比如自定义的身份验证头可以保持一致。
  • 参数(Parameters):例如,多个请求共享相同的 API 密钥或身份标识符。

requests.Session 用法

requests.Session 对象提供了一种机制来保持会话状态。它会在多个请求之间自动携带相关的 cookies 和 headers。

示例:使用会话保持登录状态

假设你有一个网站需要登录才能访问其他页面

import requests

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

# 登录请求,发送 POST 数据
login_data = {'username': 'myusername', 'password': 'mypassword'}
session.post('https://example.com/login', data=login_data)

# 现在已经登录了,后续的请求会自动携带登录的 cookies
response = session.get('https://example.com/dashboard')
print(response.text)  # 输出登录后的页面

在这个例子中:

  1. session.post 执行登录操作,服务器返回的会话 cookies 被保存在 session 对象中。
  2. session.get 之后的请求会自动携带这些 cookies,使得服务器能够识别这是同一个登录用户。

会话保持的优势

  1. 自动携带 cookies:不需要手动管理每个请求的 cookies。
  2. 节省资源:可以复用连接,提高请求效率。
  3. 保持认证状态:登录后的每个请求自动带上凭证,避免重复登录。

复用自定义请求头

在使用 requests.Session 时,不仅可以复用 cookies,还可以复用任何你希望在多个请求中保持一致的请求头(headers),例如 X-Tokenrequests.Session 会自动管理 session cookies,但对于其他自定义的请求头,你需要手动设置。

如何在 requests.Session 中复用自定义请求头

示例:复用 X-Token

你可以在 Session 对象中设置自定义请求头,这样在所有使用该会话发出的请求中,这些头部都会自动包含。

import requests

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

# 设置自定义请求头
session.headers.update({'X-Token': 'your_token_value'})

# 发送第一个请求,使用 X-Token
response1 = session.get('https://example.com/api/endpoint1')
print(response1.text)

# 发送第二个请求,自动包含 X-Token
response2 = session.get('https://example.com/api/endpoint2')
print(response2.text)

# 如果需要在某些请求中不使用 X-Token,可以临时修改 headers
response3 = session.get('https://example.com/api/endpoint3', headers={'X-Token': None})
print(response3.text)

关键点

  1. 更新请求头:使用 session.headers.update() 可以一次性设置多个请求头,包括自定义的 X-Token
  2. 自动携带:在该会话对象中发出的所有请求都会自动包含这些请求头。
  3. 临时修改:如果你需要在某个请求中临时修改或移除 X-Token,可以在发送请求时覆盖该头部。

3.4 代理设置

代理设置是在网络请求中使用代理服务器的配置。这可以帮助你在发送请求时通过一个中间服务器进行转发,而不是直接与目标服务器进行通信。代理设置有多种用途,主要包括:

1. 隐私保护

使用代理可以隐藏你的真实 IP 地址,保护你的在线隐私。这样,目标网站只能看到代理服务器的 IP,而无法直接获取到你的个人 IP。

2. 访问控制

某些网络或网站可能会限制特定 IP 地址或地区的访问。通过代理,可以绕过这些限制,访问被屏蔽的内容。

3. 性能提升

在某些情况下,代理可以缓存请求的响应,减少请求时间并提高加载速度。特别是在使用同一个代理的多个用户都请求相同资源时。

4. 测试和开发

开发者在测试应用程序时,可以通过代理设置模拟不同的网络条件、地理位置和网络环境。

5. 数据抓取

在进行 web 爬虫时,使用代理可以避免因频繁请求同一网站而被禁止访问。通过切换不同的代理,可以从多个 IP 地址同时进行请求,从而提高抓取效率。

代理设置示例

在使用 Python 的 requests 库时,可以通过以下方式设置代理:

import requests

# 设置 HTTP 和 HTTPS 代理
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'https://10.10.1.10:1080',
}

# 使用代理进行请求
response = requests.get('https://example.com', proxies=proxies)
print(response.text)

代理类型

  • 透明代理:用户意识不到它的存在,通常用于缓存和内容过滤。
  • 匿名代理:隐藏用户的真实 IP 地址,但代理服务器的 IP 地址会被暴露。
  • 高匿代理(Elite Proxy):完全隐藏用户的 IP 地址,连代理服务器的 IP 地址也不被透露。

使用代理的场景

  1. 网络安全:通过代理隐藏真实 IP 地址,增加隐私保护。
  2. 地理限制:通过代理服务器绕过地理位置的访问限制,访问特定国家/地区的资源。
  3. 负载均衡:使用多个代理来均衡负载,避免对单一服务器发出过多请求。
  4. 网络测试:在开发中通过代理测试不同网络条件下的请求行为。

3.5 认证

from requests.auth import HTTPBasicAuth

response = requests.get('https://example.com', auth=HTTPBasicAuth('user', 'pass'))

4. 高级选项

4.1 重定向控制

response = requests.get('https://example.com', allow_redirects=False)

4.2 发送自定义请求

response = requests.request('GET', 'https://example.com')

5. 安装 requests

使用 pip 安装:

pip install requests
posted @ 2024-10-14 14:31  ganph  阅读(78)  评论(0)    收藏  举报