You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyInstaller打包Scrapy脚本为EXE时遇多类报错求助

解决PyInstaller打包Scrapy爬虫为EXE时的依赖与资源文件问题

我来帮你搞定这个打包问题——Scrapy和PyInstaller搭配确实容易踩一些依赖和资源文件的坑,咱们一步步来解决:

问题根源分析

  1. FileNotFoundError: scrapy/VERSION:Scrapy在启动时会读取这个版本文件,但PyInstaller默认不会打包非Python代码的资源文件,手动复制能临时解决,但不是长久之计。
  2. ModuleNotFoundError: No module named 'email.mime':这是Python标准库的模块,但Scrapy是间接引用它的,PyInstaller的自动依赖检测没捕捉到,所以需要手动告诉它要包含这个模块。

完整解决方案:使用.spec文件配置打包

手动复制文件太繁琐,咱们用PyInstaller的.spec文件来统一管理所有依赖和资源,步骤如下:

1. 生成初始.spec文件

先运行你之前的命令生成.spec模板:

pyinstaller.exe --onefile main.py

这会在当前目录生成main.spec文件。

2. 修改.spec文件配置

打开main.spec,找到datas和hiddenimports这两个参数,修改成下面的内容(注意替换你的Python安装路径):

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['你的项目根路径'],
             binaries=[],
             # 配置需要打包的资源文件:Scrapy的VERSION、你的代理和UA文件
             datas=[
                 (r'C:\Python36\Lib\site-packages\scrapy\VERSION', 'scrapy'),
                 ('proxies.txt', '.'),
                 ('useragents.txt', '.')
             ],
             hiddenimports=[
                 # 添加缺失的email.mime模块,以及Scrapy可能用到的其他隐性依赖
                 'email.mime',
                 'email.mime.text',
                 'scrapy.utils.misc',
                 'scrapy.utils.log'
             ],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

3. 用修改后的.spec文件重新打包

运行下面的命令,用配置好的.spec文件打包:

pyinstaller.exe main.spec

为什么这样能解决问题?

  • datas参数:告诉PyInstaller把指定的资源文件打包进去,并且在运行时放到指定的目录下(比如把Scrapy的VERSION放到exe所在目录的scrapy子目录,把你的代理/UA文件放到exe同目录)。
  • hiddenimports参数:强制PyInstaller包含那些自动检测没抓到的依赖模块,email.mime就是典型的间接引用模块,Scrapy内部用到但PyInstaller没检测到。

额外注意事项

  • 如果之后还出现其他ModuleNotFoundError,只需要把对应的模块添加到hiddenimports里就行。
  • 确保你的proxies.txt和useragents.txt在打包时和main.py同目录,这样datas配置才能正确找到它们。

内容的提问来源于stack exchange,提问作者Dainius Preimantas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:40