技术探索与实践最佳实践:从零开始用 Python 写一个后端爬虫项目

代码里的小宇宙
2025-12-15 00:33
阅读 855

大家好,我是你们的老朋友,一名在大厂干了三年后端开发的工程师,业余时间也在 B 站做技术 UP 主。最近收到不少私信,问我:“完全没接触过编程,怎么入门?能不能教我一个既有后端又带爬虫的小项目?”

其实我当初学的时候也是一头雾水——看到“后端”“爬虫”这些词就犯怵,以为要懂很多高深的东西。但后来发现,只要拆解清楚、动手做一遍,其实没那么难。所以今天这篇教程,就是专门写给零基础小白的,手把手带你用 Python 完成一个既能抓数据(爬虫),又能提供接口(后端) 的小项目。

💡 为什么选这个组合?
因为它能让你一次性理解两个核心概念:如何获取数据(爬虫) + 如何对外提供服务(后端)。这是很多实际项目的起点!


一、我们要做什么?

我们做一个简单的“天气查询服务”:

  1. 爬虫部分:从公开网站(比如中国天气网)抓取某个城市的实时天气。
  2. 后端部分:用 Flask(一个轻量级 Python 后端框架)搭建一个 Web 接口,别人访问 http://localhost:5000/weather?city=北京 就能拿到 JSON 格式的天气数据。

是不是听起来很酷?别担心,代码我都给你写好了,你只需要跟着一步步敲。


二、环境准备:5 分钟搞定开发环境

你需要安装什么?

工具 作用 安装方式
Python 3.8+ 编程语言运行环境 官网下载 python.org
pip Python 包管理工具 安装 Python 时自动包含
VS Code(或任意编辑器) 写代码的工具 官网下载即可

安装依赖库

打开终端(Mac/Linux 用 Terminal,Windows 用 CMD 或 PowerShell),执行以下命令:

# 创建项目文件夹
mkdir weather-service && cd weather-service

# 安装所需库
pip install flask requests beautifulsoup4
  • flask:用来写后端 API
  • requests:用来发 HTTP 请求(模拟浏览器访问网页)
  • beautifulsoup4:用来解析网页内容(像“筛子”一样把我们需要的数据捞出来)

✅ 验证是否安装成功:
在终端输入 python,然后依次输入:

import flask, requests, bs4
print("All good!")

如果没报错,说明环境 OK!


三、核心概念:用大白话讲清楚“后端”和“爬虫”

什么是后端?

你可以把后端想象成“餐厅的厨房”:

  • 用户(前端/手机 App)点菜(发送请求)
  • 厨房(后端)做菜(处理逻辑、查数据库、调爬虫等)
  • 做好后把菜端出去(返回 JSON 数据)

我们的 Flask 项目就是一个“微型厨房”,只负责一件事:根据城市名返回天气

什么是爬虫?

爬虫就像“信息搬运工”:

  1. 模拟人打开浏览器 → 访问网址(比如 http://www.weather.com.cn/weather1d/101010100.shtml
  2. 把整个网页“拿下来”
  3. 从中找出我们需要的部分(比如“北京 25°C 晴”)
  4. 整理成结构化数据(比如 {"city": "北京", "temp": "25°C", "weather": "晴"}

⚠️ 注意:爬虫要遵守网站的 robots.txt 规则,不要频繁请求,更不能用于商业用途!我们这里仅用于学习。


四、实战项目:一步步写出你的第一个后端+爬虫项目

步骤 1:先写爬虫函数

创建文件 crawler.py,内容如下:

# crawler.py
import requests
from bs4 import BeautifulSoup

def get_weather(city_name):
    # 简化版:我们用一个模拟数据代替真实爬取(避免反爬问题)
    # 实际项目中你会在这里解析真实网页
    mock_data = {
        "北京": {"temp": "25°C", "weather": "晴"},
        "上海": {"temp": "28°C", "weather": "多云"},
        "广州": {"temp": "32°C", "weather": "雷阵雨"},
    }
    
    if city_name in mock_data:
        return {
            "city": city_name,
            "temp": mock_data[city_name]["temp"],
            "weather": mock_data[city_name]["weather"]
        }
    else:
        return {"error": "城市未找到"}

📌 为什么用模拟数据?
真实网站有反爬机制(比如验证码、IP 限制),新手容易卡住。先掌握流程,后面再升级!

步骤 2:写后端 API

创建文件 app.py

# app.py
from flask import Flask, request, jsonify
from crawler import get_weather

app = Flask(__name__)

@app.route('/weather')
def weather_api():
    city = request.args.get('city', '')  # 从 URL 参数获取 city
    if not city:
        return jsonify({"error": "请提供城市名,例如:?city=北京"}), 400
    
    result = get_weather(city)
    return jsonify(result)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

步骤 3:运行项目

在终端执行:

python app.py

你会看到类似输出:

 * Running on http://127.0.0.1:5000

步骤 4:测试接口

打开浏览器,访问:

http://localhost:5000/weather?city=北京

你应该看到:

{
  "city": "北京",
  "temp": "25°C",
  "weather": "晴"
}

✅ 恭喜!你已经完成了第一个“后端+爬虫”项目!


五、升级版:尝试真实爬虫(可选进阶)

如果你觉得模拟数据不过瘾,可以试试抓取真实网站。以“中国天气网”为例(注意:仅限学习,勿高频请求):

# 真实爬虫示例(替换 crawler.py 中的 get_weather 函数)
def get_weather_real(city_code="101010100"):  # 北京的编码
    url = f"http://www.weather.com.cn/weather1d/{city_code}.shtml"
    headers = {"User-Agent": "Mozilla/5.0"}  # 伪装成浏览器
    
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        resp.encoding = 'utf-8'
        soup = BeautifulSoup(resp.text, 'html.parser')
        
        # 这里需要根据网页结构调整选择器(需开发者工具查看)
        temp_tag = soup.select_one(".tem")
        weather_tag = soup.select_one(".wea")
        
        if temp_tag and weather_tag:
            temp = temp_tag.text.strip()
            weather = weather_tag.text.strip()
            return {"temp": temp, "weather": weather}
        else:
            return {"error": "数据解析失败"}
    except Exception as e:
        return {"error": f"请求失败: {str(e)}"}

⚠️ 常见问题:

  • 网页结构经常变,选择器会失效 → 学会用浏览器“检查元素”
  • 被封 IP → 加 time.sleep(1) 控制频率,或使用代理(高级话题)

六、新手常见问题解答(FAQ)

Q1:为什么我的代码运行报错 “ModuleNotFoundError”?

A:说明你没装依赖。回到“环境准备”部分,确保执行了 pip install flask requests beautifulsoup4

Q2:浏览器打不开 localhost:5000

A:检查:

  • 终端是否还在运行 python app.py(别关了)
  • 防火墙是否阻止(一般不会)
  • 换成 127.0.0.1:5000 试试

Q3:爬虫总被网站拒绝怎么办?

A:这是正常现象!真实网站都有反爬。建议:

  • headers 伪装浏览器
  • 控制请求频率(每秒最多 1 次)
  • 初学者优先用公开 API(比如和风天气、OpenWeather),比爬网页更稳定

Q4:Flask 是后端?那 Django 呢?

A:Flask 和 Django 都是 Python 后端框架。Flask 轻量、灵活,适合小项目;Django 功能全(自带用户系统、后台等),适合大项目。新手从 Flask 入门更友好


七、学习建议 & 下一步路线图

✅ 今天你学会了:

  • 如何用 Flask 写一个简单 API
  • 如何用 requests + BeautifulSoup 抓取网页(或模拟)
  • 如何把两者结合起来做完整项目

🔜 接下来建议你:

阶段 学习内容 推荐资源
巩固基础 Python 函数、字典、异常处理 廖雪峰 Python 教程
深入爬虫 XPath、Selenium、代理池 《Python 网络数据采集》
后端进阶 RESTful API 设计、数据库(SQLite) Flask 官方文档
项目实战 加数据库存天气历史、加缓存防重复爬 GitHub 搜 “flask weather”

🚫 避坑指南(血泪经验):

  1. 不要一上来就啃大项目 → 从小功能做起,比如今天这个
  2. 不要死记代码 → 理解每一行的作用,自己改参数试试
  3. 遇到报错别慌 → 复制错误信息 Google,90% 的问题别人都遇到过

结语

技术探索的本质,不是记住多少知识,而是建立“我能搞定它”的信心。我当初第一次跑通 Flask + 爬虫时,兴奋得差点把键盘扔了(笑)。希望今天的教程也能给你带来这种“原来如此!”的顿悟时刻。

如果你跟着做完了,不妨在评论区留言:“我的天气服务跑起来啦!”——我会随机抽几位同学送《Python 自动化实战》电子书。

下期预告:《用一行代码部署你的 Flask 项目到云服务器》,教你把本地服务变成全网可访问!

记得点赞关注,我是你们的大厂搬砖 UP 主,我们下期见!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝