Bootstrap

库学习01-Requests

以下参考Real Python:

Python's Requests Library (Guide) – Real Python

一、安装和导入

1. 安装

$ python -m pip install requests

2.导入

import requests

二、GET请求

HTTP 方法(例如GETPOST)决定了在发出 HTTP 请求时尝试执行的操作。

最常见的 HTTP 方法之一是GET。该GET方法表示您正在尝试从指定资源获取或检索数据。要GET使用 Requests 发出请求,可以调用requests.get()。

>>> import requests
>>> requests.get("https://api.github.com")
<Response [200]>

自定义请求参数

自定义请求的一种常见方法是通过URL 中的查询字符串GET参数传递值。要执行此操作,您需要将数据传递给get()。例如,您可以使用 GitHub 的存储库搜索API 来查找流行的 Python 存储库:

import requests

url = "https://api.github.com/search/repositories"
params = {
    "q": "language:python",  # 搜索语言为 Python 的仓库
    "sort": "stars",         # 按星标数排序
    "order": "desc"          # 按降序排列
}

response = requests.get(url, params=params)

if response.status_code == 200:
    data = response.json()
    for repo in data['items'][:5]:  # 获取前 5 个仓库
        print(f"仓库名称: {repo['name']}")
        print(f"星标数: {repo['stargazers_count']}")
        print(f"URL: {repo['html_url']}")
        print("-" * 40)
else:
    print("请求失败:", response.status_code)

这些参数名和作用完全取决于你调用的 API 设计。如果你在调用一个特定的 API,最好的做法是查看该 API 的官方文档,里面会详细列出所有可用的参数、参数的类型和是否必需。

例如,请求获得含有“爱国”标签的今日头条标题

# 今日头条搜索URL(爱国标签)
url = 'https://www.toutiao.com/api/search/content/'
params = {
    'keyword': '爱国',  # 搜索关键词
    'offset': 0,        # 分页偏移量
    'format': 'json',   # 返回格式
    'autoload': 'true',
    'count': 20,        # 每页数量
    'cur_tab': 1,
    'from': 'search_tab'
}

三、响应Response

response是一个功能强大的对象,可用于检查请求的结果。

>>> import requests
>>> response = requests.get("https://api.github.com")

(一)Status Codes

200 OK状态表示您的请求成功,而404 NOT FOUND状态表示未找到您要查找的资源。

if response.status_code == 200:
    print("Success!")
elif response.status_code == 404:
    print("Not Found.")

(二)Content与Text

请求的响应GET通常在消息主体中包含一些有价值的信息,称为有效负载。使用 的属性和方法Response,您可以以多种不同的格式查看有效负载。  要查看响应的内容bytes,可以使用.content:

>>> import requests

>>> response = requests.get("https://api.github.com")
>>> response.content
b'{"current_user_url":"https://api.github.com/user", ...}'

>>> type(response.content)
<class 'bytes'>

虽然.content允许您访问响应有效负载的原始字节,但您通常希望使用字符编码(例如UTF-8 )将它们转换为字符串。当您访问时将为您执行此操作:response.text

>>> response.text
'{"current_user_url":"https://api.github.com/user", ...}'

>>> type(response.text)
<class 'str'>

 由于解码需要编码bytes方案,如果您未指定编码方案,Requests 将尝试根据响应的标头str猜测编码。您可以在访问之前通过设置来提供显式编码:.encoding.text

response.text 和 response.content 的区别
属性/方法返回类型说明
response.text字符串自动解码后的响应内容(根据 response.encoding 或 HTTP 头推断编码)
response.content字节原始的二进制响应内容(未解码)

 (三)Json

如果服务器返回的是 JSON 格式的数据,可以使用 response.json() 将其解析为 Python 字典或列表。

如果响应内容不是 JSON 格式,调用 response.json() 会抛出 json.decoder.JSONDecodeError 异常。

>>> response.json()
{'current_user_url': 'https://api.github.com/user', ...}

>>> type(response.json())
<class 'dict'>

 (四)Header

响应头信息(字典形式),例如响应负载的内容类型以及缓存响应的时间限制。

>>> import requests

>>> response = requests.get("https://api.github.com")
>>> response.headers
{'Server': 'GitHub.com',
...
'X-GitHub-Request-Id': 'AE83:3F40:2151C46:438A840:65C38178'}

.headers返回一个类似字典的对象,允许您按键访问标头值。例如,要查看响应有效负载的内容类型,您可以访问"Content-Type": 

>>> response.headers["Content-Type"]
'application/json; charset=utf-8'

不过,这个类似字典的 headers 对象有一些特殊之处。HTTP 规范将 headers 定义为不区分大小写,这意味着您可以访问这些 headers 而不必担心它们的大小写:

自定义Header
get()要自定义标头,您可以使用参数传递 HTTP 标头字典headers。

1. 身份验证和授权

大多数 API 和 Web 服务要求客户端通过身份验证(如 API 密钥、OAuth token)来访问其资源。在这种情况下,Authorization 头是必需的,用于传递身份验证信息。例如,使用 Bearer Token 进行身份验证:

CopyEdit

import requests

url = "https://api.example.com/data"
headers = {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}

response = requests.get(url, headers=headers)

2. 模拟浏览器行为

许多网站和 API 会检测请求的来源。如果请求头中没有包含常见的浏览器信息(如 User-Agent),服务器可能会认为这是一个机器人请求,从而拒绝响应或返回验证码。在请求头中添加 User-Agent,模拟浏览器的行为。

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)

不同浏览器的User-Agent可在网上查到。

3. 处理 Cookies

某些网站需要 Cookies 来维持会话状态(如登录状态)。在请求头中添加Cookies,传递服务器需要的 Cookies。

headers = {
    'Cookie': 'sessionid=YOUR_SESSION_ID; csrftoken=YOUR_CSRF_TOKEN'
}
response = requests.get(url, headers=headers)

;