跳转至

14.4 爬虫:错误排查(答疑补充课)

内容梗概

这是一节针对上节课 Scrapy 作业的答疑课,集中解答两个学生提问最多的典型问题。第一个问题是运行 scrapy crawl 报 "no active project"——原因是没有在含有 scrapy.cfg 配置文件的项目根目录下执行命令;老师借此再次强调"当前工作目录"这一从大一反复讲到现在的基础概念。第二个问题更经典:Windows 上 pip install scrapy 时报错,真正失败的是其依赖库 Twisted 在编译扩展时缺少 Microsoft Visual C++ 14.0 编译工具。老师借这个案例完整示范了"读报错输出 → 找到第一个 error → 梳理依赖链推理根因"的排错方法论,并重申他的观点:会看错误日志、能自己解决异常,才算编程入门。

知识点详解

问题一:scrapy crawl 报 "no active project"(约 00:00 - 03:00)

  • 现象:很多同学运行 scrapy crawl 爬虫名 失败,提示 "no active project"(没有激活的项目)。
  • 排查演示:
  • pwd 查看当前所在目录;ls(PowerShell/Linux)或 dir(cmd.exe)列出当前目录文件。
  • 必须在含有 scrapy.cfg(配置文件)的目录下运行 scrapy 命令才有效。
  • 用 cd .. 回到上级目录再运行同一命令 → 必然失败。
  • 原因:Scrapy 判断"是否一个项目"的逻辑是——在**你执行命令时所在的当前文件夹**下找 .cfg 配置文件,找到才算项目;再从 cfg 里找到 settings 目录和项目名,才能正常执行。spiders/ 子目录里没有 cfg,只有项目根目录有。
  • 引申:每个人的仓库结构不同,今后自己用 Scrapy 爬东西也要注意它的执行逻辑。这类"路径/当前目录不对"的问题极常见,从大一《计算机安全与维护》讲到现在,甚至读研、工作后遇到的很多 bug 都是同一根源。

问题二:pip 安装 Scrapy 编译报错(约 03:00 - 17:40)

  • 现象:Windows 上 pip install scrapy(或 pipenv install scrapy)时,进度条读了一堆包之后报错(老师因本机已有编译环境无法复现,用学生截图讲解)。
  • 排错方法论(本课核心):
  • 找到真正报错的对象:安装 Scrapy 时 pip 会先装它依赖的包(A、B、C…),依赖还有自己的依赖,逐个装下去。导致失败的不是 Scrapy 本身,而是它依赖的第三方库 Twisted(约 08:00)。
  • Twisted 是干什么的:异步发送 HTTP 请求的库。普通爬虫串行发请求(发一个等响应再发下一个);真正的爬虫项目需要多个线程并发发请求,每个请求完成后用回调函数处理 response——这种"发出去不等回来就先做别的、回来后用回调处理"的逻辑叫**异步**。Scrapy 靠 Twisted 支持异步,效率大大提高(约 08:20 - 09:40)。
  • 看输出、找第一个 error:报错输出里一堆 warning 不用管(发布者自己也没消除);要往下读,务必找到**第一个 error**——第一个 error 往往才是触发整个错误的元凶(约 11:00 - 12:00)。
  • 读懂 error:输出显示 building ... extension——在**编译**(回忆 C 语言的编译概念)Twisted 的某个扩展时失败,原因是 Microsoft Visual C++ 14.0 is required,并给出了获取 Build Tools for Visual Studio 的链接(约 12:00 - 13:20)。
  • 推理根因:联系之前模块与包一章讲的知识——有些 Python 包包含的是纯源代码,下载后需要在本机**编译**;这台电脑上没有编译工具(就是大一 C 语言课装 VS 时带的编译器、链接器、头文件、库文件那套东西),所以报错。解决:下载安装该编译工具即可(约 13:20 - 15:30)。
  • 替代方案:也可以下载已编译好的**二进制包**(whl)来解决(约 16:25,呼应 10.4 离线安装与 whl 文件一课)。
  • 老师点评:这个推理过程不需要老师讲——认真读输出,凭大家的智力都能推出来;但大多数人看到一堆输出就直接无视了。"会看错误日志输出、会自己解决问题,才算编程入门"——会不会写代码都不算入门,能自己解决遇到的异常才算。debug 才是真正的推理(比推理剧、侦探小说更真实)。

如何正确提问(约 16:45 - 17:36)

  • 有同学说"装了编译工具后一点变化都没有"——这种问法无法回答。
  • 正确提问至少要提供:① 你下载/安装的到底是什么(是不是报错链接里给的那个工具,还是自己按关键词搜错了);② 安装之后的报错输出(安装前后对比)。提供这些信息老师才能回答。

示例与演示

  • 演示 1(目录问题):在 scrapy 项目根目录用 pwd/ls 确认存在 scrapy.cfg 后运行爬虫成功;cd .. 后退一级再运行 → 失败,对比展示当前目录的作用。
  • 演示 2(编译报错):以一位同学的报错截图为素材,逐段解读 pip 安装输出:先是一堆 copy/warning → building 'twisted.test' extension → 第一个 error:Microsoft Visual C++ 14.0 is required 及官方下载链接。示范了从输出到根因的完整推理链:Scrapy 安装失败 ← Twisted 安装失败 ← 编译扩展失败 ← 本机没有 C++ 编译工具 ← 装 Build Tools(或改用二进制 whl 包)。

重点与难点

  • 当前工作目录意识:很多命令行工具(Scrapy 是典型)按"执行命令时所在目录"寻找配置文件;报 "no active project" 先检查自己在哪。
  • 排错三步:梳理依赖链找到真正报错的对象 → 无视 warning、找到第一个 error → 读懂 error 结合已学知识推理根因。
  • "第一个 error 才是元凶"——后面的报错往往只是连锁反应。
  • 含 C 扩展的 Python 包在 Windows 上安装需要本机编译环境(MSVC Build Tools),或改用预编译的二进制 whl。
  • 提问的艺术:报错截图 + 你做了什么操作,缺一不可。

关联内容

  • 直接对应 14.4-Scrapy 正课的作业实践:scrapy startproject 生成的 scrapy.cfg、scrapy crawl 命令、pip install scrapy。
  • 呼应 10.4(离线安装与 whl 文件):源代码包需编译 vs 二进制包免编译的区分。
  • 呼应 10.x 包管理:pip 安装时的依赖链机制。
  • 基础概念:大一 C 语言的编译/链接概念、命令行基本命令(pwd/ls/dir/cd)。
  • 这是 48 学时课程的最后 4 学时之一,老师把"会看错误日志"作为整个课程送给学生的核心能力收尾。