Python网络编程与HTTP请求入门:requests、接口调用、网页抓取与基础服务端
前面我们已经学习了文件读写、数据处理,以及一批常用标准库。接下来,一个非常自然的问题就是:
如果数据不在本地文件里,而是在网络另一端,Python 应该怎么获取?
这就是网络编程要解决的问题。
在真实开发中,Python 非常常见的用途之一,就是和网络服务打交道,例如:
- 调用 HTTP 接口;
- 获取网页内容;
- 提交表单数据;
- 下载文件;
- 编写简单 Web 服务;
- 编写爬虫或数据采集脚本。
也就是说,很多 Python 程序其实都在做一件事:
从网络获取数据,处理数据,再把结果交给用户或其他系统。
本文会围绕最常见的入门场景展开:
- HTTP 的基本概念;
- 使用
requests发送 GET 和 POST 请求; - 处理响应状态码、请求头和 JSON 数据;
- 下载文件;
- 网页抓取基础;
- Python 内置服务端的简单认识。
理解这一章之后,你就能开始写很多常见的网络脚本了,例如:
- 查询接口数据;
- 抓取网页标题;
- 下载图片或文件;
- 编写一个简单的本地测试服务。
一、为什么网络编程很重要?
很多程序的数据并不在本地,而是在:
- 网站页面;
- 第三方 API;
- 公司内部服务;
- 云端数据库接口;
- 各种 HTTP 服务。
所以你只会处理本地文件还不够,还要学会:
- 怎么向服务器发请求;
- 怎么接收响应;
- 怎么解析返回内容;
- 怎么处理网络错误。
这也是 Python 在自动化、运维、数据采集、后端开发里非常强势的原因之一。
二、先理解 HTTP 在干什么
在开始写代码之前,先建立最基础的概念。
当你在浏览器打开一个网页时,本质上通常发生了这样一件事:
- 客户端向服务器发起 HTTP 请求;
- 服务器返回响应;
- 响应中带有状态码、响应头和响应体;
- 客户端再根据内容进行展示或处理。
2.1 常见请求方法
最常见的 HTTP 方法包括:
GET:获取资源;POST:提交数据;PUT:整体更新资源;PATCH:部分更新资源;DELETE:删除资源。
入门阶段最常用的通常是 GET 和 POST。
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 | import requests |
这里:
response.status_code是状态码;response.text是响应文本。
3.3 获取 JSON 数据
很多接口返回的是 JSON。
1 | import requests |
如果确定响应是 JSON,通常优先使用 response.json(),比自己手动解析更方便。
3.4 发送带参数的 GET 请求
1 | import requests |
这里 params 会被自动拼接到 URL 查询参数中。
四、POST 请求:向服务端提交数据
如果是提交表单或 JSON 数据,通常会用 POST。
4.1 提交表单数据
1 | import requests |
4.2 提交 JSON 数据
1 | import requests |
这里 json=payload 会自动:
- 把 Python 字典编码成 JSON;
- 设置合适的
Content-Type请求头。
这比手工 json.dumps() 再自己补请求头更自然。
五、请求头、超时与错误处理
网络请求最怕的不是“写不出来”,而是:
- 请求一直卡住;
- 服务器拒绝;
- 返回内容不是你预期的格式;
- 程序因为网络问题直接崩掉。
5.1 自定义请求头
1 | import requests |
请求头常用于:
- 指定客户端身份;
- 传认证信息;
- 指定数据格式;
- 模拟浏览器行为。
5.2 一定要知道 timeout
1 | import requests |
如果不加超时,有些请求可能会卡很久。
所以在真实项目里,一个很重要的习惯是:
网络请求尽量显式设置
timeout。
5.3 用 raise_for_status() 判断请求是否成功
1 | import requests |
如果状态码是 4xx 或 5xx,这通常会抛出异常。
5.4 捕获请求异常
1 | import requests |
这是非常常见的写法,因为网络请求本来就具有不稳定性。
六、下载文件:网络脚本的高频场景
6.1 下载一个小文件
1 | import requests |
这里使用的是:
response.content:二进制内容;'wb':二进制写入模式。
6.2 为什么不能拿图片用 response.text?
因为图片、压缩包、音视频等都不是纯文本。
这时你要优先想到:
- 二进制响应 →
response.content - 二进制文件 →
'wb'
6.3 大文件下载时的思路
对于更大的文件,通常会采用分块读取的方式,避免一次占用太多内存。
1 | import requests |
七、网页抓取基础:拿到 HTML 后做什么?
很多时候你获取到的不是 JSON,而是 HTML 页面。
7.1 获取网页内容
1 | import requests |
7.2 为什么只靠字符串处理不够?
因为 HTML 往往结构复杂,如果你只是用字符串截取:
- 很容易脆弱;
- 页面结构一变就失效;
- 可读性也差。
所以真实抓取场景里,通常还会配合 HTML 解析库,例如下一篇要讲的 beautifulsoup4。
不过在入门阶段,你先建立一个认识就够了:
网页抓取通常分两步:先请求页面,再解析 HTML。
7.3 一个简单标题提取示意
如果先不引入解析库,只做一个最粗略的演示:
1 | import requests |
这种方式适合演示思路,但不适合复杂页面解析。
八、Session:保持会话状态
有些网站和接口不是“请求一次就完事”,而是需要多次请求共享状态,例如:
- 登录后再访问用户数据;
- 多次请求复用 Cookie;
- 维持某些会话信息。
这时可以使用 Session。
1 | import requests |
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.text 和 response.content 混用
可以这样记:
- 文本响应 →
text - JSON 响应 →
json() - 二进制响应 →
content
10.3 不要无脑频繁请求网站
尤其是抓取网页时,要注意:
- 网站是否允许抓取;
- 请求频率是否过高;
- 是否需要延时和限速;
- 是否涉及登录、权限和法律边界。
这不仅是技术问题,也是合规和礼貌问题。
10.4 不要忽略 HTTPS 和证书问题
真实项目里,HTTPS 是常态。大多数时候 requests 会帮你处理好,但你至少要知道:
- HTTPS 是加密连接;
- 某些证书问题会导致请求失败;
- 不要轻易为了省事就关闭证书校验。
十一、一个综合示例:查询接口并保存结果
下面写一个稍微完整一点的小例子。
目标:
- 请求一个 JSON 接口;
- 检查状态;
- 把结果保存到本地文件。
1 | import json |
这个例子虽然简单,但已经串起了几个很重要的步骤:
- 发送请求;
- 传递参数;
- 检查错误;
- 解析 JSON;
- 本地保存。
这正是很多 Python 网络脚本最常见的基本模式。
十二、学习建议:这一章优先掌握什么?
12.1 先掌握最核心的请求流程
优先级通常是:
requests.get()/requests.post()params/data/jsonstatus_coderaise_for_status()timeouttry ... except requests.RequestException
这几项已经能解决大量基础问题。
12.2 先把“客户端”学扎实,再继续学“服务端”
对于大多数初学者来说:
- 先会调用接口;
- 再会抓网页;
- 最后再学 Web 框架;
这个顺序更自然。
12.3 抓取网页时要把“请求”和“解析”分开理解
很多人一说爬虫就把所有东西混在一起。
更清晰的理解方式是:
- 网络请求拿到页面;
- HTML 解析提取数据;
- 数据清洗和保存。
这样后面学习 BeautifulSoup 时会轻松很多。
十三、总结
这一篇我们系统梳理了 Python 中“网络编程与 HTTP 请求入门”的核心内容:
- HTTP 基础概念:理解请求方法、状态码和响应结构;
requests基本用法:掌握GET和POST请求;- 参数与 JSON 处理:学会传查询参数、表单数据和 JSON 数据;
- 请求头与超时控制:提高请求的稳定性和可控性;
- 错误处理:学会处理请求失败、状态码异常和超时问题;
- 文件下载:理解文本响应与二进制响应的区别;
- 网页抓取基础:建立“请求页面 → 解析 HTML”的基本认知;
- Session 会话:理解多次请求共享状态的意义;
- 基础服务端认识:知道 Python 也可以提供简单的 HTTP 服务。
如果说前面的章节更多是在处理本地数据,那么这一篇更像是在回答:
当数据在网络上时,Python 应该如何把它安全、稳定地拿回来?
掌握这一篇之后,你已经能够开始写接口调用脚本、简单爬虫和网络自动化程序了。
继续往后写时,比较自然的衔接方向通常有两个:
- Python常用第三方库入门:例如
beautifulsoup4、pandas、openpyxl; - Python Web 开发入门:例如 Flask 或 FastAPI 的基础实践。