使用Pyinstaller打包Scrapy项目的时候遇到各种坑,首先感谢La_vie_est_belle分享的文章,给了很大的帮助。结合他的分享我稍微整理一下。遇到的最难的坑,文末有提到。
转载地址:https://blog.csdn.net/la_vie_est_belle/article/details/79017358
这个是我的项目目录:

众所周知,dist,build和crawl.spec是打包后生成的文件。
思路就是:写一个脚本来运行我们的Scrapy项目,接着用Pyinstaller将该脚本转化为exe文件。
刚开始想用以下脚本文件来运行:
from scrapy import cmdline
cmdline.execute("scrapy crawl SpiderName".split())
最终发现不行(所以想用该脚本来打包的同学三思。。不过你当然也可以试试。。。说不定可以解决。)
后来突然想到Scrapy文档有专门讲是怎么运行爬虫的:https://doc.scrapy.org/en/latest/topics/practices.html
- from scrapy.crawler import CrawlerProcess
- from scrapy.utils.project import get_project_settings
- process = CrawlerProcess(get_project_settings())
- # 'followall' is the name of one of the spiders of the project.
- process.crawl('followall', domain='scrapinghub.com')
- process.start() # the script will block here until the crawling is finished
然后开始用Pyinstaller打包:
在项目下shift+右键,然后点击‘’在此处打开命令窗口‘’,输入:
pyinstaller crawl.py
最终生成dist,build和crawl.spec这三个文件。
打开dist->crawl->crawl.exe,会发现有闪退现象(解决办法就是把该exe文件拖入cmd中运行)
在cmd中我们发现错误是缺少scrapy文件夹下的VERSION

接下来你需要在crawl.exe同目录下新建一个scrapy文件夹
然后到你安装的scrapy文件夹中把VERSION和mime.types两个文件复制到刚才创建的scrapy文件夹中(如果只复制VERSION的话,那之后还会提示找不到mime.types文件,所以这里就两个一块讲了)

完成后再运行crawl.exe文件,发现提示缺少模块,缺哪一个就在crawl.py中import哪一个,于是乎,好像差点要把整个scrapy框架都import进来。。。(这里花了我蛮久时间)
以下就是提示缺少的模块
- import robotparser
- import scrapy.spiderloader
- import scrapy.statscollectors
- import scrapy.logformatter
- import scrapy.dupefilters
- import scrapy.squeues
- import scrapy.extensions.spiderstate
- import scrapy.extensions.corestats
- import scrapy.extensions.telnet
- import scrapy.extensions.logstats
- import scrapy.extensions.memusage
- import scrapy.extensions.memdebug
- import scrapy.extensions.feedexport
- import scrapy.extensions.closespider
- import scrapy.extensions.debug
- import scrapy.extensions.httpcache
- import scrapy.extensions.statsmailer
- import scrapy.extensions.throttle
- import scrapy.core.scheduler
- import scrapy.core.engine
- import scrapy.core.scraper
- import scrapy.core.spidermw
- import scrapy.core.downloader
- import scrapy.downloadermiddlewares.stats
- import scrapy.downloadermiddlewares.httpcache
- import scrapy.downloadermiddlewares.cookies
- import scrapy.downloadermiddlewares.useragent
- import scrapy.downloadermiddlewares.httpproxy
- import scrapy.downloadermiddlewares.ajaxcrawl
- import scrapy.downloadermiddlewares.chunked
- import scrapy.downloadermiddlewares.decompression
- import scrapy.downloadermiddlewares.defaultheaders
- import scrapy.downloadermiddlewares.downloadtimeout
- import scrapy.downloadermiddlewares.httpauth
- import scrapy.downloadermiddlewares.httpcompression
- import scrapy.downloadermiddlewares.redirect
- import scrapy.downloadermiddlewares.retry
- import scrapy.downloadermiddlewares.robotstxt
- import scrapy.spidermiddlewares.depth
- import scrapy.spidermiddlewares.httperror
- import scrapy.spidermiddlewares.offsite
- import scrapy.spidermiddlewares.referer
- import scrapy.spidermiddlewares.urllength
- import scrapy.pipelines
- import scrapy.core.downloader.handlers.http
- import scrapy.core.downloader.contextfactory
- import scrapy.pipelines.images # 用到图片管道
- import openpyxl # 用到openpyxl库
上面没有注释的那些行应该就是要必须引入的了。
所以整个crawl.py文件看起来是这样的(为了方便看官区分,我加了一些注释)
- # -*- coding: utf-8 -*-
- from scrapy.crawler import CrawlerProcess
- from scrapy.utils.project import get_project_settings
- # 这里是必须引入的
- import robotparser
- import scrapy.spiderloader
- import scrapy.statscollectors
- import scrapy.logformatter
- import scrapy.dupefilters
- import scrapy.squeues
- import scrapy.extensions.spiderstate
- import scrapy.extensions.corestats
- import scrapy.extensions.telnet
- import scrapy.extensions.logstats
- import scrapy.extensions.memusage
- import scrapy.extensions.memdebug
- import scrapy.extensions.feedexport
- import scrapy.extensions.closespider
- import scrapy.extensions.debug
- import scrapy.extensions.httpcache
- import scrapy.extensions.statsmailer
- import scrapy.extensions.throttle
- import scrapy.core.scheduler
- import scrapy.core.engine
- import scrapy.core.scraper
- import scrapy.core.spidermw
- import scrapy.core.downloader
- import scrapy.downloadermiddlewares.stats
- import scrapy.downloadermiddlewares.httpcache
- import scrapy.downloadermiddlewares.cookies
- import scrapy.downloadermiddlewares.useragent
- import scrapy.downloadermiddlewares.httpproxy
- import scrapy.downloadermiddlewares.ajaxcrawl
- import scrapy.downloadermiddlewares.chunked
- import scrapy.downloadermiddlewares.decompression
- import scrapy.downloadermiddlewares.defaultheaders
- import scrapy.downloadermiddlewares.downloadtimeout
- import scrapy.downloadermiddlewares.httpauth
- import scrapy.downloadermiddlewares.httpcompression
- import scrapy.downloadermiddlewares.redirect
- import scrapy.downloadermiddlewares.retry
- import scrapy.downloadermiddlewares.robotstxt
- import scrapy.spidermiddlewares.depth
- import scrapy.spidermiddlewares.httperror
- import scrapy.spidermiddlewares.offsite
- import scrapy.spidermiddlewares.referer
- import scrapy.spidermiddlewares.urllength
- import scrapy.pipelines
- import scrapy.core.downloader.handlers.http
- import scrapy.core.downloader.contextfactory
- # 以下两行是我的项目有用到的
- import scrapy.pipelines.images # 用到图片管道
- import openpyxl # 用到openpyxl库
- process = CrawlerProcess(get_project_settings())
- # 'Books' is the name of one of the spiders of the project.
- process.crawl('Books')
- process.start() # the script will block here until the crawling is finished
因为我这个例子项目用到一张图片资源blank.png(当爬取不到图片的时候就用这个白色图片代替),所以还需要把这张图片放到crawl.exe同路径下。
好,到这里就差不多可以了。重新用Pyinstaller打包:pyinstaller crawl.py
完成后点击dist->crawl->crawl.exe
以为到这里就完成了,结果提示:KeyError: 'Spider not found:' ,难道是爬虫名不对,重新确认一遍后,没有任何问题,没打包前运行是正常的。尝试了各种方法后发现问题了。
Pyinstaller打包的时候,目录要进入到项目目录中去,不然打包后就容易出这个问题,即进入:Scrapy_Books。
重新打包,运行,提示:not found mould xxxx.aaaa,在 crawl.py中导入模块依旧不行,原因是这个模块是我自己写的一个接口,调用发送邮件的,结果怎么调整都不对。后面干脆写到piplines里去。
重新打包,运行。这次终于可以了。不知道为啥Pyinstaller打包,自己写的接口无法打包进入,尝试过pyinstaller crawl.py -p +接口路径 打包依旧未成功。最后放弃整合到了piplines里了。
虽然麻烦,但总算是解决了。。。
总之一句话:缺什么,import什么
还遇到一个问题,就是打包好后,移植到其他电脑上,自己电脑是64位系统,移植过去的是32位系统,结果无法运行,存在兼容问题。各种查询后,据说32位系统的,要在32位系统上打包。未验证,不知道有没有其他方式可以直接在64位系统里打包32位的包。望知道的大神路过能指点一二。

本文详细介绍了使用Pyinstaller将Scrapy爬虫项目打包为exe文件的过程及遇到的问题解决方案,包括缺失依赖、兼容性等问题。
&spm=1001.2101.3001.5002&articleId=81030413&d=1&t=3&u=03ef697c816c4576b2dbf085ad701fea)

被折叠的 条评论
为什么被折叠?



