创建你的首个Scrapy工程 - 项目结构、配置与初始化完整指南

📂 所属阶段:第一阶段 — 初出茅庐(框架核心篇)
🔗 相关章节:Scrapy 五大核心组件 · Spider 实战

装完Scrapy后第一步踩坑点是什么?大概率是「敲完scrapy startproject后一堆文件,不知道哪个该改」。本文帮你快速理清核心结构、配置项,并创建一个能跑的示例爬虫。


环境准备

基础要求

  • Python版本: 3.8+(推荐3.9/3.10,兼容性和效率最优)
  • 操作系统: Windows/macOS/Linux通用

安装与验证

# 全局或虚拟环境安装(强烈推荐虚拟环境隔离依赖)
pip install scrapy

# 验证是否安装成功
scrapy version
# 输出示例:Scrapy 2.11.0

创建项目

命令行操作

Scrapy提供了标准化的项目生成命令,不用手动搭文件夹:

# 1. 生成项目(自定义有意义的名称,比如news_crawler)
scrapy startproject news_crawler

# 2. 进入项目根目录
cd news_crawler

# 3. 查看生成的基础结构
ls -la  # Windows用dir

项目结构详解

标准分层结构

生成的项目是Python包架构,核心文件/目录如下:

news_crawler/
├── scrapy.cfg                 # 部署到Scrapyd的全局配置(开发时很少改)
└── news_crawler/             # 项目业务代码包
    ├── __init__.py           # Python包标识文件(空文件即可)
    ├── items.py              # 定义结构化数据字段(类似ORM模型)
    ├── middlewares.py        # 自定义请求/响应处理逻辑(中间件)
    ├── pipelines.py          # 数据清洗、去重、存储逻辑(管道)
    ├── settings.py           # 全局项目配置(核心!)
    └── spiders/              # 所有爬虫的存放目录
        ├── __init__.py       # 爬虫子包标识
        └── example.py        # 默认生成的示例爬虫(可以删除重写)

核心文件优先级表

先记住哪些是开发初期必须改的:

文件/目录开发初期优先级主要用途
settings.py⭐⭐⭐⭐⭐全局配置(UA、并发、延迟等)
spiders/⭐⭐⭐⭐⭐写具体的爬取逻辑
items.py⭐⭐⭐⭐定义爬取的结构化数据
pipelines.py⭐⭐⭐⭐数据落地
middlewares.py⭐⭐⭐加代理、UA池等高级功能
scrapy.cfg部署到Scrapyd时才改

配置文件详解

仅改开发初期必要的settings.py

默认配置里的大部分项不用动,先改这几个:

1. 基础标识配置

# settings.py
BOT_NAME = 'news_crawler'  # 项目名,自动生成的不用改

# 必须指定的User-Agent(默认UA会被很多网站拦截!)
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'

# 关闭ROBOTSTXT_OBEY(仅学习测试用,生产环境建议开启或协商!)
ROBOTSTXT_OBEY = False

2. 防封核心配置

# settings.py
# 同一域名的并发请求数(目标站友好设为2-4,学习可设为8)
CONCURRENT_REQUESTS_PER_DOMAIN = 4

# 两次请求的固定延迟(单位:秒)
DOWNLOAD_DELAY = 1

# 自动在DOWNLOAD_DELAY基础上加随机延迟(0.5-1.5倍之间)
RANDOMIZE_DOWNLOAD_DELAY = True

3. 数据导出配置(学习测试必加)

# settings.py
# 导出数据的编码(Windows/macOS通用utf-8)
FEED_EXPORT_ENCODING = 'utf-8'

创建第一个爬虫

用命令快速生成基础爬虫

spiders/目录下生成指定网站的爬虫:

# 命令格式:scrapy genspider 爬虫名 允许爬取的域名
scrapy genspider techcrunch techcrunch.com

生成后会在spiders/techcrunch.py里看到模板代码,直接修改即可

# spiders/techcrunch.py
import scrapy

class TechcrunchSpider(scrapy.Spider):
    name = 'techcrunch'  # 唯一标识,运行爬虫时用的就是这个
    allowed_domains = ['techcrunch.com']  # 只爬取这个域名下的链接
    start_urls = ['https://techcrunch.com/category/startups/']  # 起始爬取地址

    def parse(self, response):
        """
        解析响应的核心方法:提取文章标题和链接
        """
        # 循环提取每篇文章
        for article in response.css('article.post-block'):
            yield {
                'title': article.css('a.post-block__title__link::text').get().strip(),
                'url': article.css('a.post-block__title__link::attr(href)').get(),
            }
        
        # 提取下一页链接并继续爬取(翻页逻辑)
        next_page = response.css('div.wp-block-query-pagination a.next::attr(href)').get()
        if next_page:
            # follow方法自动拼接相对路径、处理allowed_domains
            yield response.follow(next_page, callback=self.parse)

验证与测试

1. 运行爬虫并实时看结果

# 在项目根目录运行
scrapy crawl techcrunch

2. 导出数据到本地文件

# 导出为JSONL(推荐,逐行存储易处理)
scrapy crawl techcrunch -o techcrunch_startups.jsonl

# 也支持JSON、CSV、XML等格式
scrapy crawl techcrunch -o techcrunch_startups.csv

3. 交互式调试选择器

如果不确定CSS/XPath对不对,可以用Scrapy Shell:

scrapy shell 'https://techcrunch.com/category/startups/'

进入Shell后测试选择器:

# 测试提取第一篇文章标题
response.css('a.post-block__title__link::text').get().strip()

# 退出Shell
exit()

常见问题排查

1. scrapy命令找不到

原因: 没有把Python的Scripts目录加入系统PATH 解决方案:

  • 虚拟环境下直接激活虚拟环境
  • 全局安装的话:
    • Windows: 把C:\Users\你的用户名\AppData\Local\Programs\Python\Python3x\Scripts加入PATH
    • macOS/Linux: 检查which python3which pip3的输出,确保路径一致

2. 爬虫启动后立即退出,没有数据

原因: 大概率是CSS/XPath选择器写错了 解决方案: 先用Scrapy Shell调试选择器,确保能提取到内容

3. 403 Forbidden错误

原因: 默认UA被拦截、没有Cookie、请求频率太快 解决方案: 先改USER_AGENTDOWNLOAD_DELAY试试


最佳实践建议

  1. 虚拟环境隔离: 每个项目单独创建虚拟环境
  2. 先调选择器再写代码: 用Scrapy Shell验证所有选择器
  3. 结构化数据: 尽量用items.py定义数据,避免直接yield字典
  4. 日志保留: 加LOG_FILE = 'logs/scrapy.log'配置,方便排查问题

💡 核心要点: settings.pyspiders/是开发初期的核心,其他文件(middlewares、pipelines)可以等需要时再改。