Python网络编程与HTTP请求入门:requests、接口调用、网页抓取与基础服务端

前面我们已经学习了文件读写、数据处理,以及一批常用标准库。接下来,一个非常自然的问题就是:

如果数据不在本地文件里,而是在网络另一端,Python 应该怎么获取?

这就是网络编程要解决的问题。

在真实开发中,Python 非常常见的用途之一,就是和网络服务打交道,例如:

  • 调用 HTTP 接口;
  • 获取网页内容;
  • 提交表单数据;
  • 下载文件;
  • 编写简单 Web 服务;
  • 编写爬虫或数据采集脚本。

也就是说,很多 Python 程序其实都在做一件事:

从网络获取数据,处理数据,再把结果交给用户或其他系统。

本文会围绕最常见的入门场景展开:

  • HTTP 的基本概念;
  • 使用 requests 发送 GET 和 POST 请求;
  • 处理响应状态码、请求头和 JSON 数据;
  • 下载文件;
  • 网页抓取基础;
  • Python 内置服务端的简单认识。

理解这一章之后,你就能开始写很多常见的网络脚本了,例如:

  • 查询接口数据;
  • 抓取网页标题;
  • 下载图片或文件;
  • 编写一个简单的本地测试服务。

一、为什么网络编程很重要?

很多程序的数据并不在本地,而是在:

  • 网站页面;
  • 第三方 API;
  • 公司内部服务;
  • 云端数据库接口;
  • 各种 HTTP 服务。

所以你只会处理本地文件还不够,还要学会:

  • 怎么向服务器发请求;
  • 怎么接收响应;
  • 怎么解析返回内容;
  • 怎么处理网络错误。

这也是 Python 在自动化、运维、数据采集、后端开发里非常强势的原因之一。


二、先理解 HTTP 在干什么

在开始写代码之前,先建立最基础的概念。

当你在浏览器打开一个网页时,本质上通常发生了这样一件事:

  1. 客户端向服务器发起 HTTP 请求;
  2. 服务器返回响应;
  3. 响应中带有状态码、响应头和响应体;
  4. 客户端再根据内容进行展示或处理。
2.1 常见请求方法

最常见的 HTTP 方法包括:

  • GET:获取资源;
  • POST:提交数据;
  • PUT:整体更新资源;
  • PATCH:部分更新资源;
  • DELETE:删除资源。

入门阶段最常用的通常是 GETPOST

2.2 常见状态码

你至少要认识这些:

  • 200 OK:请求成功;
  • 201 Created:创建成功;
  • 301 / 302:重定向;
  • 400 Bad Request:请求参数有问题;
  • 401 Unauthorized:未认证;
  • 403 Forbidden:无权限;
  • 404 Not Found:资源不存在;
  • 500 Internal Server Error:服务器内部错误。

看到状态码时,第一反应应该是:

先判断请求是否成功,再看返回内容。


三、使用 requests 发送最基本的 HTTP 请求

Python 标准库里有更底层的网络模块,但入门和日常开发中,最常用的 HTTP 客户端之一通常是第三方库 requests

3.1 安装 requests
1
pip install requests
3.2 发送一个最简单的 GET 请求
1
2
3
4
5
6
import requests

response = requests.get('https://httpbin.org/get')
print(response)
print(response.status_code)
print(response.text)

这里:

  • response.status_code 是状态码;
  • response.text 是响应文本。
3.3 获取 JSON 数据

很多接口返回的是 JSON。

1
2
3
4
5
6
import requests

response = requests.get('https://httpbin.org/get')
data = response.json()
print(data)
print(data['url'])

如果确定响应是 JSON,通常优先使用 response.json(),比自己手动解析更方便。

3.4 发送带参数的 GET 请求
1
2
3
4
5
6
7
8
9
10
import requests

params = {
'keyword': 'python',
'page': 1,
}

response = requests.get('https://httpbin.org/get', params=params)
print(response.url)
print(response.json())

这里 params 会被自动拼接到 URL 查询参数中。


四、POST 请求:向服务端提交数据

如果是提交表单或 JSON 数据,通常会用 POST

4.1 提交表单数据
1
2
3
4
5
6
7
8
9
import requests

payload = {
'username': 'alice',
'password': '123456',
}

response = requests.post('https://httpbin.org/post', data=payload)
print(response.json())
4.2 提交 JSON 数据
1
2
3
4
5
6
7
8
9
import requests

payload = {
'name': 'Alice',
'age': 20,
}

response = requests.post('https://httpbin.org/post', json=payload)
print(response.json())

这里 json=payload 会自动:

  • 把 Python 字典编码成 JSON;
  • 设置合适的 Content-Type 请求头。

这比手工 json.dumps() 再自己补请求头更自然。


五、请求头、超时与错误处理

网络请求最怕的不是“写不出来”,而是:

  • 请求一直卡住;
  • 服务器拒绝;
  • 返回内容不是你预期的格式;
  • 程序因为网络问题直接崩掉。
5.1 自定义请求头
1
2
3
4
5
6
7
8
import requests

headers = {
'User-Agent': 'Mozilla/5.0 Python Demo',
}

response = requests.get('https://httpbin.org/headers', headers=headers)
print(response.json())

请求头常用于:

  • 指定客户端身份;
  • 传认证信息;
  • 指定数据格式;
  • 模拟浏览器行为。
5.2 一定要知道 timeout
1
2
3
4
import requests

response = requests.get('https://httpbin.org/delay/2', timeout=5)
print(response.status_code)

如果不加超时,有些请求可能会卡很久。

所以在真实项目里,一个很重要的习惯是:

网络请求尽量显式设置 timeout

5.3 用 raise_for_status() 判断请求是否成功
1
2
3
4
import requests

response = requests.get('https://httpbin.org/status/404')
response.raise_for_status()

如果状态码是 4xx5xx,这通常会抛出异常。

5.4 捕获请求异常
1
2
3
4
5
6
7
8
import requests

try:
response = requests.get('https://httpbin.org/get', timeout=5)
response.raise_for_status()
print(response.json())
except requests.RequestException as e:
print('请求失败:', e)

这是非常常见的写法,因为网络请求本来就具有不稳定性。


六、下载文件:网络脚本的高频场景

6.1 下载一个小文件
1
2
3
4
5
6
7
8
import requests

url = 'https://httpbin.org/image/png'
response = requests.get(url, timeout=10)
response.raise_for_status()

with open('image.png', 'wb') as f:
f.write(response.content)

这里使用的是:

  • response.content:二进制内容;
  • 'wb':二进制写入模式。
6.2 为什么不能拿图片用 response.text

因为图片、压缩包、音视频等都不是纯文本。

这时你要优先想到:

  • 二进制响应 → response.content
  • 二进制文件 → 'wb'
6.3 大文件下载时的思路

对于更大的文件,通常会采用分块读取的方式,避免一次占用太多内存。

1
2
3
4
5
6
7
8
9
import requests

url = 'https://example.com/bigfile.zip'
with requests.get(url, stream=True, timeout=20) as response:
response.raise_for_status()
with open('bigfile.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)

七、网页抓取基础:拿到 HTML 后做什么?

很多时候你获取到的不是 JSON,而是 HTML 页面。

7.1 获取网页内容
1
2
3
4
5
6
import requests

response = requests.get('https://example.com', timeout=10)
response.raise_for_status()
html = response.text
print(html[:200])
7.2 为什么只靠字符串处理不够?

因为 HTML 往往结构复杂,如果你只是用字符串截取:

  • 很容易脆弱;
  • 页面结构一变就失效;
  • 可读性也差。

所以真实抓取场景里,通常还会配合 HTML 解析库,例如下一篇要讲的 beautifulsoup4

不过在入门阶段,你先建立一个认识就够了:

网页抓取通常分两步:先请求页面,再解析 HTML。

7.3 一个简单标题提取示意

如果先不引入解析库,只做一个最粗略的演示:

1
2
3
4
5
6
7
8
9
10
import requests
import re

response = requests.get('https://example.com', timeout=10)
response.raise_for_status()
html = response.text

match = re.search(r'<title>(.*?)</title>', html, re.IGNORECASE | re.DOTALL)
if match:
print(match.group(1).strip())

这种方式适合演示思路,但不适合复杂页面解析。


八、Session:保持会话状态

有些网站和接口不是“请求一次就完事”,而是需要多次请求共享状态,例如:

  • 登录后再访问用户数据;
  • 多次请求复用 Cookie;
  • 维持某些会话信息。

这时可以使用 Session

1
2
3
4
5
6
7
8
import requests

session = requests.Session()
session.headers.update({'User-Agent': 'Python Session Demo'})

response1 = session.get('https://httpbin.org/cookies/set/demo/123', timeout=5)
response2 = session.get('https://httpbin.org/cookies', timeout=5)
print(response2.json())

Session 的价值通常包括:

  • 自动保存 Cookie;
  • 多次请求复用部分配置;
  • 某些场景下还能提升效率。

九、简单认识服务端:Python 也可以提供 HTTP 服务

前面讲的是“客户端请求别人”,但 Python 也可以自己当服务端。

9.1 用标准库启动一个最简单的静态文件服务

在某个目录下执行:

1
python -m http.server 8000

然后浏览器访问:

1
http://127.0.0.1:8000

这会把当前目录作为一个简单静态文件服务暴露出来。

这非常适合:

  • 临时共享文件;
  • 本地测试;
  • 快速验证目录内容。
9.2 为什么这不等于正式 Web 开发?

因为真正的 Web 服务通常需要:

  • 路由;
  • 参数处理;
  • 模板渲染;
  • 中间件;
  • 数据库;
  • 鉴权;
  • 部署。

这些通常会用框架来做,例如 Flask、Django、FastAPI。

所以你可以把标准库这个示例理解为:

  • 先认识“Python 可以提供 HTTP 服务”;
  • 但正式 Web 开发还要继续往后学。

十、网络请求中的常见误区

10.1 不要默认网络永远稳定

很多初学者写请求时会下意识认为:

  • 请求一定成功;
  • 返回一定是 JSON;
  • 数据字段一定存在。

真实世界里这几乎一定会出问题。

更稳妥的思路是:

  • 检查状态码;
  • 设置超时;
  • 捕获异常;
  • 对关键字段做校验。
10.2 不要把 response.textresponse.content 混用

可以这样记:

  • 文本响应 → text
  • JSON 响应 → json()
  • 二进制响应 → content
10.3 不要无脑频繁请求网站

尤其是抓取网页时,要注意:

  • 网站是否允许抓取;
  • 请求频率是否过高;
  • 是否需要延时和限速;
  • 是否涉及登录、权限和法律边界。

这不仅是技术问题,也是合规和礼貌问题。

10.4 不要忽略 HTTPS 和证书问题

真实项目里,HTTPS 是常态。大多数时候 requests 会帮你处理好,但你至少要知道:

  • HTTPS 是加密连接;
  • 某些证书问题会导致请求失败;
  • 不要轻易为了省事就关闭证书校验。

十一、一个综合示例:查询接口并保存结果

下面写一个稍微完整一点的小例子。

目标:

  • 请求一个 JSON 接口;
  • 检查状态;
  • 把结果保存到本地文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import json
from pathlib import Path

import requests

url = 'https://httpbin.org/get'
params = {
'keyword': 'python',
'page': 1,
}

try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
data = response.json()

output_path = Path('api_result.json')
output_path.write_text(
json.dumps(data, ensure_ascii=False, indent=2),
encoding='utf-8'
)
print('保存成功:', output_path)
except requests.RequestException as e:
print('请求失败:', e)

这个例子虽然简单,但已经串起了几个很重要的步骤:

  • 发送请求;
  • 传递参数;
  • 检查错误;
  • 解析 JSON;
  • 本地保存。

这正是很多 Python 网络脚本最常见的基本模式。


十二、学习建议:这一章优先掌握什么?

12.1 先掌握最核心的请求流程

优先级通常是:

  • requests.get() / requests.post()
  • params / data / json
  • status_code
  • raise_for_status()
  • timeout
  • try ... except requests.RequestException

这几项已经能解决大量基础问题。

12.2 先把“客户端”学扎实,再继续学“服务端”

对于大多数初学者来说:

  • 先会调用接口;
  • 再会抓网页;
  • 最后再学 Web 框架;

这个顺序更自然。

12.3 抓取网页时要把“请求”和“解析”分开理解

很多人一说爬虫就把所有东西混在一起。

更清晰的理解方式是:

  1. 网络请求拿到页面;
  2. HTML 解析提取数据;
  3. 数据清洗和保存。

这样后面学习 BeautifulSoup 时会轻松很多。


十三、总结

这一篇我们系统梳理了 Python 中“网络编程与 HTTP 请求入门”的核心内容:

  1. HTTP 基础概念:理解请求方法、状态码和响应结构;
  2. requests 基本用法:掌握 GETPOST 请求;
  3. 参数与 JSON 处理:学会传查询参数、表单数据和 JSON 数据;
  4. 请求头与超时控制:提高请求的稳定性和可控性;
  5. 错误处理:学会处理请求失败、状态码异常和超时问题;
  6. 文件下载:理解文本响应与二进制响应的区别;
  7. 网页抓取基础:建立“请求页面 → 解析 HTML”的基本认知;
  8. Session 会话:理解多次请求共享状态的意义;
  9. 基础服务端认识:知道 Python 也可以提供简单的 HTTP 服务。

如果说前面的章节更多是在处理本地数据,那么这一篇更像是在回答:

当数据在网络上时,Python 应该如何把它安全、稳定地拿回来?

掌握这一篇之后,你已经能够开始写接口调用脚本、简单爬虫和网络自动化程序了。

继续往后写时,比较自然的衔接方向通常有两个:

  • Python常用第三方库入门:例如 beautifulsoup4pandasopenpyxl
  • Python Web 开发入门:例如 Flask 或 FastAPI 的基础实践。

参考资料