Python编程实战:综合项目 —— 迷你爬虫项目

这个实战专门让你体验"从零搭一个可用的小爬虫",功能虽然轻量,但结构、流程、容错、模块化都完整得像样,是一个非常适合作为综合训练的项目。


一、项目目标

开发一个迷你爬虫,实现:

  1. 输入一个网页 URL
  2. 自动发起请求并获取网页内容
  3. 提取网页中的标题、正文文字、链接
  4. 将结果保存到本地
  5. 提供基础的异常处理(网络错误、解析错误等)
  6. 使用模块化结构可扩展

这是一个"只用 Python 标准库 + requests + BeautifulSoup"就能完成的轻量项目。


二、所需库

bash 复制代码
pip install requests beautifulsoup4 lxml

项目中需要用到:

  • requests:用于发送 HTTP 请求
  • bs4(BeautifulSoup):用于解析网页
  • lxml:加速解析并提升稳定性

三、项目结构设计

推荐这样的结构:

bash 复制代码
mini_spider/
│── main.py            # 主程序入口
│── fetcher.py         # 网络请求模块
│── parser.py          # 数据解析模块
│── saver.py           # 文件保存模块
│── output/            # 保存爬取结果

这会让程序更像"可维护的小项目",而不是零散脚本。


四、编写网络请求模块 fetcher.py

python 复制代码
import requests

def fetch_html(url, timeout=10):
    headers = {
        "User-Agent": "Mozilla/5.0 (Mini Spider Project)"
    }
    try:
        resp = requests.get(url, headers=headers, timeout=timeout)
        resp.raise_for_status()
        resp.encoding = resp.apparent_encoding
        return resp.text
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None

功能亮点:

  • 自定义 UA 防止部分网站拒绝
  • raise_for_status() 帮你捕获 404/500
  • timeout 防止卡死
  • 稳健的异常处理

五、编写解析模块 parser.py

示例:提取文章标题、正文文本、所有超链接。

python 复制代码
from bs4 import BeautifulSoup

def parse_page(html):
    try:
        soup = BeautifulSoup(html, "lxml")

        title = soup.title.string if soup.title else "无标题"

        # 提取正文
        paragraphs = [p.get_text(strip=True) for p in soup.find_all("p")]
        content = "\n".join(paragraphs)

        # 提取链接
        links = [a['href'] for a in soup.find_all("a", href=True)]

        return {
            "title": title,
            "content": content,
            "links": links
        }

    except Exception as e:
        print(f"解析失败: {e}")
        return None

这个解析逻辑简单但通用,能适配大部分普通网页。


六、保存模块 saver.py

把爬取结果保存为 txt 文件。

python 复制代码
import os

def save_result(data, filename="result.txt"):
    if not os.path.exists("output"):
        os.makedirs("output")

    filepath = os.path.join("output", filename)

    with open(filepath, "w", encoding="utf-8") as f:
        f.write(f"标题:{data['title']}\n\n")
        f.write("正文内容:\n")
        f.write(data["content"])
        f.write("\n\n链接列表:\n")
        for link in data["links"]:
            f.write(link + "\n")

    print(f"已保存到 {filepath}")

你也可以扩展成:

  • 保存为 JSON
  • 保存为 CSV
  • 保存为 HTML
  • 保存为知识库

七、主程序 main.py

python 复制代码
from fetcher import fetch_html
from parser import parse_page
from saver import save_result

def main():
    url = input("请输入要爬取的URL:")

    html = fetch_html(url)
    if not html:
        print("获取网页失败")
        return

    data = parse_page(html)
    if not data:
        print("解析失败")
        return

    save_result(data, filename="爬取结果.txt")
    print("爬取完成!")

if __name__ == "__main__":
    main()

运行效果:

arduino 复制代码
请输入要爬取的URL:http://example.com
正在保存...
爬取完成!

八、项目特色亮点

这个"迷你爬虫项目"虽然简单,但框架很专业,因为它包含:

  • 模块化开发
  • 独立网络层 + 解析层 + 存储层
  • 异常处理全链路
  • 对网页按结构信息拆解
  • 工程结构可扩展性强

你稍微扩展一下就能变成:

✔ 批量 URL 爬虫 ✔ 采集新闻网站文章 ✔ 采集商品标题价格 ✔ 监控网页变化 ✔ 小规模数据采集脚本


九、可扩展方向(项目升级建议)

如果你想进一步强化,可以加入:

1. 批量 URL 爬取

从文件读取 URL 列表,一次抓一批。

2. 自动限速 & 重试机制

降低被封风险。

3. 代理池

提高稳定性。

4. 结构化存储(JSON/CSV)

方便后续分析。

5. GUI 图形界面(Tkinter)

变成真正的桌面工具。


相关推荐
Tony Bai1 小时前
“我曾想付钱给 Google 去工作”—— Russ Cox 深度访谈:Go 的诞生、演进与未来
开发语言·后端·golang
路边草随风1 小时前
milvus向量数据库使用尝试
人工智能·python·milvus
newobut2 小时前
vscode远程调试python程序,基于debugpy库
vscode·python·调试·debugpy
APIshop2 小时前
用 Python 把“API 接口”当数据源——从找口子到落库的全流程实战
开发语言·python
serendipity_hky2 小时前
【SpringCloud | 第2篇】OpenFeign远程调用
java·后端·spring·spring cloud·openfeign
嘟嘟MD2 小时前
程序员副业 | 2025年11月复盘
后端·创业
SadSunset2 小时前
(15)抽象工厂模式(了解)
java·笔记·后端·spring·抽象工厂模式
汝生淮南吾在北2 小时前
SpringBoot+Vue养老院管理系统
vue.js·spring boot·后端·毕业设计·毕设
李慕婉学姐3 小时前
【开题答辩过程】以《基于springboot的地铁综合服务管理系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端
一点晖光3 小时前
Docker 作图咒语生成器搭建指南
python·docker