
前言
Scrapy 爬虫完成功能开发、逻辑调试、容错优化后,最终需要落地至服务器、办公主机、多节点集群等不同环境运行。原生 Scrapy 依赖命令行手动执行启动指令,在多设备迁移、批量部署、无人值守运行场景下存在操作繁琐、依赖缺失、启动流程不统一等问题。同时常规 Python 项目直接拷贝源码的部署方式,易出现环境版本不一致、模块导入异常、权限不足等线上故障。
结合前文已完成的模块化架构、自动重试中间件、SQLite 数据入库、多栏目适配能力,本文聚焦Scrapy 项目打包、启动脚本封装、环境依赖统一管理、跨平台部署全流程。通过批处理脚本、Python 启动器、项目打包、依赖固化等技术,实现一键启动、一键环境初始化、免命令行操作的部署方案,同时区分 Windows 与 Linux 运行环境,讲解线上服务常驻、后台运行、日志重定向等运维配套能力,适配个人使用、企业批量部署、服务器长期运维等各类场景。
本文涉及核心工具与官方资源:
一、部署场景分析与整体方案规划
1.1 主流部署场景梳理
结合爬虫项目落地经验,归纳四类典型部署场景,不同场景对应差异化打包与启动方案:
表格
| 本地单机使用 | Windows 个人电脑 | 每次启动需打开终端、输入命令,操作繁琐 | 编写 bat 一键启动脚本,图形化双击运行 |
| 小型局域网分发 | 多台 Windows 主机 | 环境不一致、依赖逐个安装效率低 | 固化依赖清单 + 一键安装依赖脚本 |
| 云服务器部署 | Linux CentOS/Ubuntu | 需要后台常驻、开机自启、日志持久化 | Shell 脚本 + 后台进程运行 + 日志重定向 |
| 生产集群部署 | 多 Linux 节点 | 项目版本统一、批量更新、统一启停 | 标准源码打包 + 统一部署脚本 + 版本管控 |
1.2 现有项目部署现存问题
基于前文模块化 Scrapy 项目,原生部署方式存在五大典型问题:
1.3 整体技术方案架构
本次部署优化分为四大模块,逐层解决上述问题,方案全程基于现有模块化架构,不改动原有业务代码:
1.4 前置检查项
部署优化前,对现有项目做完整性校验,保证打包后功能正常:
二、第一步:依赖版本固化与批量安装方案
依赖统一是跨环境部署的基础,避免因库版本差异导致的运行报错。本节完成依赖导出、批量安装脚本编写,适配 Windows 与 Linux 双平台。
2.1 生成精准依赖清单
在开发完成、功能正常的主机上,打开终端进入项目根目录,执行依赖导出命令,捕获当前环境所有已安装包及版本:
bash
运行
# 导出当前环境全部依赖至 requirements.txt
pip freeze > requirements.txt
执行完成后,根目录requirements.txt会补充完整版本信息,示例内容如下:
txt
scrapy==2.11.0
lxml==5.2.1
Twisted==24.3.0
cryptography==42.0.8
itemadapter==0.8.0
protego==0.3.1
pyOpenSSL==24.1.0
queuelib==1.7.0
service-identity==24.1.0
w3lib==2.2.1
该文件包含运行项目所需的全部第三方库及精确版本,目标主机可基于此文件一键还原环境。
2.2 批量安装依赖脚本
2.2.1 Windows 依赖安装脚本(install_dep.bat)
在项目根目录新建install_dep.bat批处理文件,实现一键检测 Python、批量安装依赖,代码如下:
bat
@echo off
chcp 65001
echo ==================== 开始安装项目依赖 ====================
echo 正在检测Python环境…
python –version
if %errorlevel% neq 0 (
echo 错误:未检测到Python环境,请先安装Python 3.8及以上版本!
pause
exit
)
echo 开始批量安装依赖包…
pip install -r requirements.txt
echo ==================== 依赖安装完成 ====================
pause
脚本原理:先检测 Python 是否存在,再读取requirements.txt批量安装所有依赖,chcp 65001解决 Windows 终端中文乱码问题。
2.2.2 Linux 依赖安装脚本(install_dep.sh)
项目根目录新建install_dep.sh脚本,适配 CentOS、Ubuntu 等主流 Linux 发行版:
shell
#!/bin/bash
echo "==================== 开始安装项目依赖 ===================="
python3 –version
if [ $? -ne 0 ]; then
echo "错误:未检测到Python3环境,请先完成安装!"
exit 1
fi
pip3 install -r requirements.txt
echo "==================== 依赖安装完成 ===================="
赋予脚本执行权限并运行:
bash
运行
chmod +x install_dep.sh
./install_dep.sh
三、第二步:分平台一键启动脚本开发
原生scrapy crawl 爬虫名命令被封装至脚本内部,用户仅需双击脚本或执行脚本指令即可启动爬虫,同时增加日志重定向、运行提示、异常捕获功能。当前项目爬虫名称为book_spider,所有启动脚本以此为基准编写。
3.1 Windows 平台启动方案
Windows 分为前台运行版(适合本地调试)与后台静默版(适合长期运行),同时配套日志持久化功能。
3.1.1 前台启动脚本(start.bat 推荐日常使用)
项目根目录新建start.bat,实现一键启动、日志输出至终端 + 本地日志文件,代码如下:
bat
@echo off
chcp 65001
echo ==================== Scrapy 图书爬虫 一键启动 ====================
echo 启动时间:%date% %time%
echo 日志将同步输出至 logs/spider.log
echo ======================================================
:: 创建日志目录(不存在则新建)
if not exist "logs" mkdir logs
:: 启动爬虫,日志重定向至日志文件
scrapy crawl book_spider >> logs/spider.log 2>&1
echo 爬虫运行结束
pause
核心代码解析:
3.1.2 后台静默启动脚本(start_silent.bat 适合长期挂机)
Windows 下使用wscript调用 VBS 脚本实现无窗口后台运行,分为两个文件配合使用。
第一个文件:start_silent.vbs(后台调用载体)
vbscript
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c start.bat",0
第二个文件:start_silent.bat(入口脚本)
bat
@echo off
echo 爬虫已转入后台静默运行,无前台窗口
echo 如需停止进程,请在任务管理器结束 python 进程
echo 日志文件位置:logs/spider.log
wscript start_silent.vbs
exit
使用方式:双击start_silent.bat,前台窗口瞬间关闭,爬虫在后台持续运行,不占用桌面窗口;可通过日志文件查看运行状态。
3.1.3 停止爬虫脚本(stop.bat)
针对 Windows 后台运行场景,新增一键停止脚本,批量结束爬虫相关 Python 进程:
bat
@echo off
chcp 65001
echo 正在终止所有爬虫进程…
taskkill /f /im python.exe /t
echo 进程已全部终止
pause
注意:该脚本会结束本机所有 Python 进程,若主机同时运行其他 Python 程序,建议通过任务管理器精准结束对应进程。
3.2 Linux 平台启动方案
Linux 服务器以后台常驻运行为核心需求,支持会话断开不终止进程、日志持久化、简单进程守护,分为基础版与进阶守护版。
3.2.1 基础后台启动脚本(start.sh)
项目根目录新建start.sh,使用nohup实现后台运行、断开 SSH 会话不退出:
shell
#!/bin/bash
echo "==================== Scrapy 爬虫 Linux 启动脚本 ===================="
# 创建日志目录
mkdir -p logs
# nohup 后台运行,& 放入后台,日志重定向
nohup scrapy crawl book_spider > logs/spider.log 2>&1 &
# 输出进程PID,方便后续终止进程
echo "爬虫启动成功,进程PID:$!"
echo "日志文件路径:./logs/spider.log"
echo "停止命令:kill -9 进程PID"
赋予权限并启动:
bash
运行
chmod +x start.sh
./start.sh
核心原理:
3.2.2 精准停止脚本(stop.sh)
通过 PID 终止进程,避免批量杀进程影响其他服务,stop.sh代码:
shell
#!/bin/bash
# 过滤爬虫进程并终止
PID=$(ps -ef | grep "scrapy crawl book_spider" | grep -v grep | awk '{print $2}')
if [ -z "$PID" ]; then
echo "未检测到运行中的爬虫进程"
else
kill -9 $PID
echo "已终止爬虫进程 PID:$PID"
fi
赋予权限并执行停止操作:
bash
运行
chmod +x stop.sh
./stop.sh
3.2.3 进阶:简单进程守护脚本
为防止爬虫意外崩溃退出,编写守护脚本定时检测进程状态,进程消失则自动重启,daemon.sh:
shell
#!/bin/bash
# 循环检测进程状态,间隔10秒
while true
do
PID=$(ps -ef | grep "scrapy crawl book_spider" | grep -v grep | awk '{print $2}')
if [ -z "$PID" ]; then
echo $(date) " 检测到爬虫已停止,执行自动重启" >> logs/daemon.log
nohup scrapy crawl book_spider > logs/spider.log 2>&1 &
fi
sleep 10
done
启动守护进程:nohup ./daemon.sh &,实现 7×24 小时无人值守运行。
四、第三步:项目标准化打包 实现完整分发
对于跨主机分发、版本归档、集群部署场景,单纯拷贝文件易出现目录缺失、权限异常,本节使用 Python 官方setuptools工具完成项目打包,生成标准分发包。
4.1 编写打包配置文件 setup.py
在项目根目录创建setup.py打包配置文件,定义项目名称、版本、依赖、目录结构,代码如下:
python
运行
from setuptools import setup, find_packages
# 读取依赖清单
with open("requirements.txt", "r", encoding="utf-8") as f:
requires = [line.strip() for line in f.readlines() if line.strip()]
setup(
name="scrapy_book_spider",
version="1.0.0",
author="dev",
description="Scrapy图书采集爬虫,集成SQLite入库、自动重试、多栏目适配",
packages=find_packages(),
install_requires=requires,
include_package_data=True,
# 额外打包静态文件、脚本、配置
package_data={
"": ["*.bat", "*.sh", "*.vbs", "requirements.txt"]
},
zip_safe=False
)
配置说明:
4.2 执行打包命令
终端进入项目根目录,执行打包指令,生成两种主流分发格式:
bash
运行
# 生成源码分发包(跨平台通用,推荐)
python setup.py sdist
# 生成wheel二进制包(Windows优先使用)
python setup.py bdist_wheel
执行完成后,项目根目录会新增dist目录,内部包含打包文件:
- 源码包:scrapy_book_spider-1.0.0.tar.gz(Linux/Windows 通用)
- wheel 包:scrapy_book_spider-1.0.0-py3-none-any.whl(Windows 快速安装)
4.3 分发包安装与部署
将dist目录下的压缩包拷贝至目标主机,完成部署。
4.3.1 源码包部署(全平台通用)
bash
运行
# 解压压缩包
tar -zxvf scrapy_book_spider-1.0.0.tar.gz
# 进入解压目录
cd scrapy_book_spider-1.0.0
# 执行依赖安装、启动脚本即可正常运行
4.3.2 Wheel 包部署(Windows)
bash
运行
pip install scrapy_book_spider-1.0.0-py3-none-any.whl
安装完成后,系统环境可直接调用项目代码,结合启动脚本即可运行。
4.4 打包文件目录完整性校验
打包完成后核对核心文件是否全部包含:
五、综合部署流程:分平台完整操作步骤
整合前文所有能力,整理 Windows、Linux 两大平台从零到运行的标准部署流程,可直接作为部署手册使用。
5.1 Windows 平台完整部署流程
- 调试使用:双击start.bat前台运行;
- 长期挂机:双击start_silent.bat后台运行;
5.2 Linux 平台完整部署流程
六、日志管理与线上运维优化
日志是线上运维的核心依据,结合部署方案补充日志切割、日志清理、日志查看相关优化策略,避免日志文件无限膨胀占用磁盘空间。
6.1 日志按日期分割(进阶优化)
长期运行场景下,单一日志文件体积会持续增大,修改启动脚本,按日期生成独立日志文件。以 Windows start.bat为例:
bat
@echo off
chcp 65001
set "logname=spider_%date:~0,4%%date:~5,2%%date:~8,2%.log"
if not exist "logs" mkdir logs
scrapy crawl book_spider >> logs/%logname% 2>&1
pause
脚本会自动生成spider_20250607.log格式日志,每日独立归档。Linux 脚本可结合date命令实现相同效果。
6.2 日志自动清理策略
编写定时清理脚本,自动删除 7 天前的历史日志,释放磁盘空间。Windows 可搭配任务计划程序,Linux 可搭配crontab定时任务。 Linux 日志清理脚本clear_log.sh:
shell
#!/bin/bash
# 删除logs目录下7天前的日志文件
find ./logs -name "*.log" -mtime +7 -rm
echo "历史日志清理完成"
配置 Linux 定时任务,每日凌晨 2 点执行清理:
bash
运行
crontab -e
# 添加内容:0 2 * * * /项目完整路径/clear_log.sh
6.3 常见部署故障排查
汇总部署阶段高频问题与解决方案:
表格
| 提示 scrapy 不是内部命令 | Python Scripts 目录未加入环境变量 | 补充 Python 环境变量,重启终端 |
| 依赖安装失败、版本冲突 | 原有环境库版本混乱 | 使用虚拟环境 python -m venv venv 隔离环境 |
| 启动后无日志、无数据 | 目录权限不足(Linux) | 执行 chmod -R 755 项目目录 赋予读写权限 |
| 后台运行自动退出 | 进程被系统 OOM 杀死 | 优化爬虫并发、降低内存占用,增加进程守护 |
| 数据库无法写入 | 部署目录无写入权限 | 移动项目至权限充足目录,或提升目录权限 |
七、方案总结与选型建议
7.1 不同场景方案选型参考
结合项目规模、运行环境、运维能力给出选型建议:
7.2 本章节核心能力总结
本文完成了 Scrapy 项目从源码开发到工程化部署的全链路落地,核心实现三大能力:
八、系列后续内容预告
本系列前五篇已依次完成:SQLite 数据入库、多栏目网页适配、项目模块化拆分、请求重试中间件、项目打包与一键部署,一套完整的单机生产级 Scrapy 爬虫体系已全部搭建完成。
下一篇将基于现有完整架构,开展公开行业榜单批量采集、数据入库与基础数据分析实战,结合多栏目采集能力、SQLite 数据库,实现批量数据爬取、数据筛选、简单统计分析,落地数据采集 + 数据分析的完整业务场景。




