讲师中心 微信公众号
AI工具推荐 视频效率加速

Scrapy项目如何分模块开发?

云婷酱_7199

云婷酱_7199

发布时间:2026-08-18 10:30:25

|

218人浏览过

|

来源于php中文网

原创

当Scrapy项目规模扩大时,必须拆分为独立模块以避免配置污染与逻辑耦合;需确认版本≥2.11、剥离settings.py直接导入、创建spiders/items/pipelines等标准目录,并通过环境变量或硬编码解耦配置。

scrapy项目如何分模块开发? - php中文网

当Scrapy项目爬取栏目超过5个、解析逻辑嵌套3层以上、中间件需适配4类反爬策略、且要支持开发/测试/生产三环境部署时,必须将原生单目录结构拆分为独立模块,否则后续新增爬虫将反复修改settings.py、items.py和pipelines.py,导致配置污染与逻辑耦合。

重构前准备:确认项目已满足模块化前提

进入项目根目录,执行 scrapy version 确认版本 ≥ 2.11;检查 scrapy.cfg[settings] 段落的 default = myproject.settings 未被手动改写为绝对路径;【若 settings.py 被直接 import 到 spider 文件中,必须先剥离,否则模块导入会失败】

删除 myproject/spiders/__init__.py(该文件在旧版Scrapy中存在,但模块化后由 spiders 包自身控制导入,留着反而干扰 Python 包发现机制)。

创建标准模块目录结构

在项目根目录下新建以下目录与空文件:

myproject/spiders/__init__.py + news_spider.py + mall_spider.py
myproject/items/__init__.py + base_item.py + product_item.py
myproject/pipelines/__init__.py + sqlite_pipeline.py + es_pipeline.py
myproject/middlewares/__init__.py + ua_rotate.py + proxy_retry.py
myproject/utils/__init__.py + url_filter.py

注意:items/pipelines/ 目录不能命名为 item/pipeline/,Scrapy 会因包名冲突报 ImportError: cannot import name 'Item' from 'scrapy.item'

重写 settings.py 实现配置解耦

方法一:用环境变量动态加载模块路径

myproject/settings.py 顶部添加:

import os
from scrapy.utils.project import get_project_settings
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SPIDER_MODULES = [f'{os.getenv("SPIDER_PKG", "myproject.spiders")}']

方法二:硬编码模块路径(适合单环境快速验证)

将原 SPIDER_MODULES = ['myproject.spiders'] 替换为:

SPIDER_MODULES = ['myproject.spiders']
ITEM_PIPELINES = {
  'myproject.pipelines.sqlite_pipeline.SQLitePipeline': 300,
  'myproject.pipelines.es_pipeline.ElasticsearchPipeline': 400,
}
DOWNLOADER_MIDDLEWARES = {
  'myproject.middlewares.ua_rotate.UARotateMiddleware': 543,
  'myproject.middlewares.proxy_retry.ProxyRetryMiddleware': 550,
}

这一步做完后,Scrapy 就能自动发现 spiders/ 下所有以 Spider 结尾的类,无需再在 settings.py 里逐个声明爬虫名。

Scrapy 2.18.0
Scrapy 2.18.0

Scrapy 2.18.0 官方源码包下载,适合 Python 网页抓取、选择器解析、Item Pipeline 和异步请求调度项目升级。

下载

定义可复用的 BaseItem 与字段继承

第一步:在 myproject/items/base_item.py 中定义通用字段

import scrapy
class BaseItem(scrapy.Item):
  url = scrapy.Field()
  crawl_time = scrapy.Field(serializer=str)
  source_site = scrapy.Field()

第二步:在 myproject/items/product_item.py 中继承并扩展

from .base_item import BaseItem
class ProductItem(BaseItem):
  sku_id = scrapy.Field()
  price = scrapy.Field()
  stock_status = scrapy.Field()

第三步:在 spider 中直接使用子类,无需重复声明基础字段

def parse(self, response):
  item = ProductItem()
  item['url'] = response.url  # 自动继承自 BaseItem
  item['sku_id'] = response.css('.sku::text').get()
  yield item

编写可插拔式中间件并启用

myproject/middlewares/ua_rotate.py 中写入:

import random
from scrapy import signals
class UARotateMiddleware:
  def __init__(self, ua_list):
    self.ua_list = ua_list
  @classmethod
  def from_crawler(cls, crawler):
    return cls(crawler.settings.getlist('USER_AGENT_LIST'))
  def process_request(self, request, spider):
    ua = random.choice(self.ua_list)
    request.headers['User-Agent'] = ua

然后在 settings.py 中添加:

USER_AGENT_LIST = [
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/120.0.0.0',
]

这样中间件就能读取配置列表,无需硬编码 UA 字符串——改配置即可生效,不用动代码。

运行指定模块下的某个爬虫

① 进入项目根目录(确保当前路径含 scrapy.cfg
② 执行命令:scrapy crawl news_spider -s LOG_LEVEL=INFO
③ 若提示 Spider not found,检查 myproject/spiders/news_spider.py 中的 class 名是否以 Spider 结尾,且文件内无语法错误;【Scrapy 只扫描 class 名含 Spider 的类,不看文件名】
④ 成功后,日志中将显示 Spider opened: news_spider,表示模块加载完成。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
免费爬虫工具有哪些
免费爬虫工具有哪些

免费爬虫工具有Scrapy、Beautiful Soup、ParseHub、Octoparse、Webocton Scriptly、RoboBrowser和Goutte。更多关于免费爬虫工具的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3933

2023.11.10

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

160

2026.09.16

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

60

2026.09.16

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

80

2026.09.16

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

40

2026.09.16

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

40

2026.09.16

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

360

2026.09.11

GDB怎么查看变量值
GDB怎么查看变量值

本专题介绍GDB调试过程中查看变量值的具体方法,涵盖局部变量、函数参数、数组、结构体和指针内容查询,同时整理变量持续显示、格式化输出及无法读取变量时的排查思路。

120

2026.09.11

GDB C++程序怎么调试
GDB C++程序怎么调试

本专题围绕GDB调试C++程序的实际过程,详细说明程序编译、调试器启动、命令行参数传入、断点命中和程序继续运行等步骤,并介绍条件断点、临时断点和观察点的设置方法,方便开发者跟踪复杂代码的执行状态。

140

2026.09.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Scrapy 官方文档与教程
Scrapy 官方文档与教程

共0课时 | 0人学习

Python Scrapy 网络爬虫实战视频教程
Python Scrapy 网络爬虫实战视频教程

共16课时 | 5.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn