只用十行代码,他让HTTP请求比喝水还简单


在这里插入图片描述

只用十行代码,他让HTTP请求比喝水还简单

第一部分 背景——为什么你需要它

在 Python 世界里,只要你想“上网”——拉天气、调支付、爬图片、连 AI 接口——就绕不开 HTTP。
然而原生的 urllib 像一把瑞士军刀:功能全,却刀刀硌手。于是,requests 出现了。
它把繁琐的底层细节藏进优雅的 API,让你用写本地文件的方式写网络请求。
接下来,我们就从“它是什么”讲到“它能做什么”,再到“踩坑怎么办”。


第二部分 它到底是什么

requestsKenneth Reitz 开源的第三方 HTTP 客户端库,口号只有一个词:HTTP for Humans
它基于 urllib3,但提供了更高层、更 Pythonic 的接口,覆盖了所有主流 HTTP 动词(GET、POST、PUT、DELETE…)与特性(Cookie、Session、SSL、代理、流式下载等)。


第三部分 安装——一行命令即可

pip install requests

国内镜像加速(可选):

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

第四部分 5 个最常用的 API,逐行拆解

#需求代码逐行说明
1发 GET,取网页r = requests.get('https://httpbin.org/get')发起 GET,返回 Response 对象
print(r.status_code)200 表示成功
print(r.text[:100])取前 100 字符看看内容
2带查询参数payload = {'key1': 'val1', 'key2': 'val2'}构造查询字典
r = requests.get('https://httpbin.org/get', params=payload)自动把字典拼到 URL
print(r.url)验证最终 URL
3发 POST,交 JSONdata = {'name': 'Alice', 'age': 18}准备 JSON 数据
r = requests.post('https://httpbin.org/post', json=data)json= 自动序列化并加头 Content-Type: application/json
print(r.json()['json'])服务器原样返回的 JSON
4下载二进制文件url = 'https://httpbin.org/image/png'示例图片
r = requests.get(url, stream=True)stream=True 边下边存,不占内存
with open('demo.png', 'wb') as f:以二进制写文件
for chunk in r.iter_content(1024):每 1 KB 写入一次
f.write(chunk)保存到本地
5自动保持 Cookie 的 Sessions = requests.Session()创建 Session 对象
s.get('https://httpbin.org/cookies/set?token=abc123')第一次请求设置 Cookie
r = s.get('https://httpbin.org/cookies')第二次请求自动带上 Cookie
print(r.json())能看到 token=abc123

第五部分 5 个真实场景,代码实战

1. 天气查询 CLI

import requests, sys

city = sys.argv[1]                             # ① 命令行读城市
key = '你的高德Key'                            # ② 去高德开放平台申请
url = 'https://restapi.amap.com/v3/weather/weatherInfo'
params = {'key': key, 'city': city}

r = requests.get(url, params=params)           # ③ 发 GET
r.raise_for_status()                           # ④ 非 200 抛异常
data = r.json()                                # ⑤ 解析 JSON
print(data['lives'][0]['weather'])             # ⑥ 打印天气

2. 一行代码上传文件到图床

files = {'smfile': open('cat.jpg', 'rb')}      # ① 构造 multipart/form-data
r = requests.post('https://sm.ms/api/v2/upload',
                  files=files,
                  headers={'Authorization': '你的Token'})
print(r.json()['data']['url'])                 # ② 得到外链

3. 钉钉群机器人告警

webhook = 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
msg = {"msgtype": "text", "text": {"content": "服务器挂了!"}}
r = requests.post(webhook, json=msg)           # 直接发 JSON
print(r.json()['errmsg'])                      # 成功返回 "ok"

4. 带 Basic Auth 拉私有仓库

from getpass import getpass
user = input('GitHub用户名: ')
pwd  = getpass('密码或Token: ')
url = 'https://api.github.com/user/repos'
r = requests.get(url, auth=(user, pwd))        # auth=() 自动加头
print([repo['full_name'] for repo in r.json()][:5])

5. 并发加速下载 100 张图片

import requests, concurrent.futures, os
urls = [f'https://picsum.photos/200/300?random={i}' for i in range(100)]

def fetch(u):
    return requests.get(u).content

os.makedirs('imgs', exist_ok=True)
with concurrent.futures.ThreadPoolExecutor(20) as ex:
    for i, data in enumerate(ex.map(fetch, urls)):
        open(f'imgs/{i}.jpg', 'wb').write(data)
print('全部下载完成')

第六部分 常见 3 个坑 + 解决方案

#Bug 场景错误信息最小复现代码 & 修复
1SSL 证书验证失败SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]requests.get('https://self-signed.badssl.com') → 修复:加 verify=False 或安装证书
2忘记设置超时导致程序卡死无报错,一直阻塞requests.get('https://httpbin.org/delay/10') → 修复:requests.get(url, timeout=5)
3编码错乱出现 ��'gbk' codec can't encode characterr = requests.get('https://httpbin.org/html')
r.text 乱码 → 修复:先 r.encoding = r.apparent_encoding.text

第七部分 总结——把网络请求变成本地操作

  • 简洁:每个 HTTP 动词都是一个同名函数。
  • 强大:Session、Cookie、代理、SSL、流式上传/下载,开箱即用。
  • 社区:几乎所有云平台 SDK 都内置或兼容 requests

一句话:只要你的代码需要“上网”,就先把 import requests 敲上去——剩下的,它都帮你搞定了。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘎啦AGI实验室

你的鼓励是我创作最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值