Python网络请求本质是模拟HTTP通信,包含请求行、头、空行、体四部分;响应同理分状态行、头、空行、体;需关注状态码、Content-Type、连接复用(Session)、超时及底层socket机制。

Python做网络请求,本质是模拟浏览器向服务器发送HTTP请求并接收响应。核心不在语言本身,而在理解HTTP协议如何工作——请求怎么发、服务器怎么回、数据怎么传、状态怎么判。
HTTP请求的四个关键部分
每次请求都包含:请求行(方法+路径+协议)、请求头(携带元信息)、空行、请求体(如POST提交的数据)。比如用requests.get("https://httpbin.org/get"),Python底层会组装出标准HTTP报文,通过TCP连接发送到目标服务器的80或443端口。
- GET请求通常无请求体,参数附在URL后(如?name=alice&age=25)
- POST请求常带JSON或表单数据,需设置Content-Type头告知服务器数据格式
- 请求头中User-Agent影响服务器是否放行,很多网站会拦截默认的python-requests标识
响应结构与状态码含义
服务器返回的响应也分四部分:状态行(协议+状态码+描述)、响应头、空行、响应体。Python收到后自动解包,response.status_code拿到状态码,response.text或response.json()解析内容。
- 200表示成功;404是资源不存在;403常因权限或反爬被拒;500是服务器内部错误
- 响应头里的Content-Type决定如何解析正文,比如application/json才能安全调用.json()
- response.headers可查看服务器返回的缓存策略、编码方式(Content-Encoding)、重定向地址等
连接管理与常见陷阱
HTTP/1.1默认启用持久连接(Keep-Alive),但Python的requests库不会自动复用连接,每次调用都是新连接——高并发时可能触发“too many open files”错误。
立即学习“Python免费学习笔记(深入)”;
- 用requests.Session()可复用TCP连接和Cookie,适合多次请求同一域名
- 超时必须显式设置:timeout=(3, 7)表示3秒连上、7秒内收到响应,否则抛出异常
- HTTPS请求依赖系统CA证书,内网或自签名证书需传verify=False(不推荐)或指定证书路径
底层通信其实走的是socket
requests库底层用urllib3,最终靠Python的socket模块建立TCP连接。你可以手动用socket发原始HTTP请求来验证理解:
- 创建socket → 连接host:port → 发送字节格式的HTTP请求字符串 → recv接收响应 → 按\r\n\r\n切分状态行和正文
- 这样能看清换行符、空行、头部大小写无关性等协议细节,但生产环境别这么写
- HTTPS则需包装成SSL socket,流程多一步TLS握手










