别说你,我以前也一样——刚开始接触Python时,觉得爬虫就是它的“半壁江山”。requests加BeautifulSoup爬回一堆数据,那种成就感别提多好了。直到有一天,产品经理跑来问我:“这些爬下来的数据,能不能做个后台页面让我随时看,还能筛选和导出?”我当场就沉默了。这显然已经不是爬虫脚本能搞定的了。
后来我接手的项目,80%都和Web开发相关:写后端接口、做管理后台、处理登录权限、连接数据库、部署服务器。所以今天想认真聊一句:别再只停留在爬虫了,Python在Web开发领域真的很强大。
从“一个能在浏览器里看的东西”开始
想象一个最简单的需求:访问一个网址,页面显示一句话,或者返回一段JSON数据给前端。用Python实现这个,用Flask这类轻量级框架就非常合适。
一个最基础的Web服务,代码可能就这么几行:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def hello():
return "你好,我是用 Python 写的 Web 服务~"
@app.route("/api/user")
def get_user():
return jsonify({"id": 1, "name": "EastBro", "role": "admin"})
if __name__ == "__main__":
# 开发环境直接跑
app.run(host="0.0.0.0", port=5000, debug=True)
运行起来后,浏览器打开 http://127.0.0.1:5000 ,就能看到返回的内容。这一刻,你的身份就从“写脚本的人”转变成了“服务提供者”。
很多人对Web开发有误解,以为必须掌握Vue、React、TypeScript一整套前端技术栈才算。其实后端这边,只要你能接收HTTP请求并返回数据,就已经在进行实打实的Web开发了。
再往前走一步:从“脚本”变成“业务系统”
一个真正的Web项目,肯定不会只打印一句话。它通常会包含:
- 用户与权限管理
- 数据库的增删改查
- 前端页面或API接口
- 一定程度的架构设计,避免代码一团糟
在构建完整业务系统方面,Python的Django框架非常出色。它遵循“自带电池”的哲学,内置了众多功能,开发体验很舒适。
比如,你想做一个简单的“文章系统”,用Django的模型和视图可以这样写:
# models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
# views.py
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_list(request):
articles = Article.objects.order_by("-created_at")
return render(request, "article_list.html", {"articles": articles})
def article_detail(request, article_id):
article = get_object_or_404(Article, id=article_id)
return render(request, "article_detail.html", {"article": article})
这几行代码完成了什么?
- 定义了一个Article数据表:Django会自动帮你创建表和字段。
- 提供了ORM(对象关系映射):
Article.objects.xxx 就是对数据库进行查询。
- 配合模板文件,一个可用的文章发布/浏览系统就成型了。
如果你还用爬虫脚本加上Excel来“管理”文章内容,效率会被这种方式秒杀。
贴近当下的场景:编写API,供前端、小程序或App调用
现在很多公司采用前后端分离的架构,小程序、H5页面、后台管理端都需要调用后端接口。我个人特别喜欢用FastAPI来处理这类需求,原因很简单:写起来很顺畅,性能也不错,而且能自动生成交互式API文档。
来看一个“待办清单”的接口服务示例:
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Todo(BaseModel):
id: int
title: str
done: bool = False
# 暂时用内存存储,真实项目会用数据库
todos: List[Todo] = []
@app.get("/todos", response_model=List[Todo])
async def list_todos():
return todos
@app.post("/todos", response_model=Todo)
async def create_todo(item: Todo):
todos.append(item)
return item
@app.put("/todos/{todo_id}", response_model=Todo)
async def update_todo(todo_id: int, item: Todo):
for i, t in enumerate(todos):
if t.id == todo_id:
todos[i] = item
return item
return item # 正常要做错误处理,这里偷个懒
@app.delete("/todos/{todo_id}")
async def delete_todo(todo_id: int):
global todos
todos = [t for t in todos if t.id != todo_id]
return {"ok": True}
运行起来后,直接访问 /docs 路径,你就能看到一套自动生成的、可在线调试的API文档。这对于团队协作非常友好,前端同学看到这个通常会眼前一亮。
回过头想想,用爬虫你在做什么?——获取别人的数据。用Web开发,你在做什么?——为别人提供数据、能力和服务。一个是“搬运工”,一个是“建工厂”,完全不在一个层次上。
数据处理:不止于requests,还有ORM、缓存与队列
做Web开发离不开数据处理。Python在这方面的生态非常完善:
- 数据库存取:Django ORM、SQLAlchemy
- 缓存:Redis(配合 aioredis、redis-py)
- 异步任务:Celery / RQ / APScheduler
举一个常见的小场景:用户提交表单,你需要将数据存入数据库,并可能进行一些统计。用SQLAlchemy的普通写法类似这样:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
engine = create_engine("sqlite:///example.db", echo=False)
SessionLocal = sessionmaker(bind=engine)
Base = declarative_base()
class Visit(Base):
__tablename__ = "visits"
id = Column(Integer, primary_key=True, index=True)
path = Column(String(200))
user_agent = Column(String(200))
Base.metadata.create_all(bind=engine)
def save_visit(path: str, ua: str):
db = SessionLocal()
try:
v = Visit(path=path, user_agent=ua)
db.add(v)
db.commit()
finally:
db.close()
然后,在你的Web框架(Flask / FastAPI / Django)中,可以在每次请求时调用它,例如在FastAPI中使用中间件:
from fastapi import Request
@app.middleware("http")
async def log_visit(request: Request, call_next):
response = await call_next(request)
path = str(request.url.path)
ua = request.headers.get("user-agent", "")
# 真实项目会放到异步任务里,这里同步写个demo
save_visit(path, ua)
return response
这就已经是一个“有数据沉淀”的小系统了,你随时可以基于这些数据做可视化、报表或分析。
异步、长连接与实时系统?Python也能应对
过去很多人认为Python慢,不适合高并发场景。但近年来,随着asyncio、uvicorn、gunicorn、FastAPI、Starlette等技术栈的成熟,情况已经不同了。
例如,你要实现“实时消息推送”,可以使用WebSocket:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws/echo")
async def websocket_echo(ws: WebSocket):
await ws.accept()
while True:
data = await ws.receive_text()
await ws.send_text(f"你刚刚说:{data}")
前端连接上这个 /ws/echo 端点,就能实现双向实时通信。你可以基于此扩展为聊天室、实时监控面板、在线客服或答题系统。
如果你的技能还停留在“发请求、取HTML、解析一下”的爬虫阶段,这些技术可能接触不到。但其实,它们的核心技能和你已经掌握的有很多共通之处:
- HTTP协议与状态码
- JSON数据格式
- URL路由
- 请求/响应模型
搞明白了爬虫里的这些概念,转向Web开发会顺畅很多。
关于部署:它没你想的那么可怕
很多同学一听到“部署”就头疼:Nginx、域名、HTTPS、反向代理……但实际上,动手做一次就会发现,部署一个Python Web服务可以很简单。一个常见的组合是:
- 用 FastAPI / Flask / Django 编写服务
- 用
uvicorn 或 gunicorn 作为应用服务器运行
- 前面用 Nginx 做反向代理和静态资源服务
- 或者,直接打包成Docker镜像,一条命令启动
一种非常简化的部署方式大致如下:
# 1. 安装依赖
pip install fastapi uvicorn
# 2. 启动服务(假设你的 app 在 app.py 里,FastAPI 实例叫 app)
uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4
然后在Nginx配置中添加一段:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
这样,一套可以从外网访问的Web服务就搭建好了。在服务器上成功运行几次后,你会发现这种成就感远超定时运行脚本:别人通过浏览器,就在使用你创造的东西。
那么,爬虫还有价值吗?
当然有。爬虫并非一无是处,它更像一个重要的“技能点”,而Web开发则是一条完整的“职业发展路径”。
将爬虫与Web开发结合起来,可以做出很多有意思的项目:
- 自制数据面板:后台定时爬取数据,前端用Web页面进行展示。
- 价格监控系统:爬取电商价格,波动时自动推送提醒到网页或微信机器人。
- 招聘信息聚合站:整理各平台招聘信息,做成一个可检索的网站供自己使用。
这时,你的爬虫技能不再是孤立的脚本,而是成为了整个系统中有价值的一环。
从爬虫迈向Web:一个实用的练习路径
如果你现在主要会爬虫,想向Web开发靠近,可以遵循一个实在的升级路径:
- 第一步:用 Flask 或 FastAPI 写一个最简单的接口,比如
/hello ,让它返回一句话。
- 第二步:增加一个路由
/api/data ,返回你爬取到的一些数据(初期写死在代码里也行)。
- 第三步:将这些数据存入 SQLite 或 MySQL,使用 ORM 读取后再通过接口返回。
- 第四步:写一个非常简单的 HTML 页面(用 Jinja2 模板即可),在页面上渲染出这些数据。
- 第五步:把整个项目部署到一台云服务器上并成功运行。
基本上,当你完成这五步,你就已经不是在“写爬虫脚本”,而是真正在做一个Web项目了。希望这些思路和示例能帮助你打开Python的另一个广阔世界。如果在动手实践中遇到具体问题,欢迎到云栈社区的技术板块交流探讨。