如何在Windows 10上使用Scrapy和PyInstaller创建一个单一的可执行文件?

5

我创建了一个Scrapy爬虫,并使用PyInstaller将其成功转换为Windows可执行文件,并将其放在了一个光盘文件夹中。

为了做到这一点,我必须对Scrapy站点包进行一些微小的更改,并将这些包添加到Windows光盘文件夹中。它完美地工作。

如何将其制作成带有注释的单个EXE文件,其中包含来自光盘文件夹的Scrapy包?

我已经尝试使用PyInstaller中的--OneFile命令,但它显示了Scrapy错误。为什么?

错误:

ImportError: No module named 'scrapy.spiderloader'

我正在从脚本中调用Scrapy,并且爬虫详细信息正在传递到crawl process()函数中。我该如何告诉PyInstaller从某个位置获取我的更新后的Scrapy包?


什么是错误? - error404
导入错误:找不到模块名为'scrapy.spiderloader', 我正在从脚本中调用scrapy,并且蜘蛛细节在crawl process()函数中传递。有什么办法告诉pyinstaller从某个位置获取我的更新的scrapy包吗? - Arun Augustine
你尝试过使用PyInstaller的hiddenimport吗?例如:--hidden-import=saidmodule.py - RockAndRoleCoder
我已经尝试过使用隐藏导入来导入Scrapy包,无论是从命令行还是.spec文件中都显示相同的错误。 - Arun Augustine
什么是“disc folder”?你是指“dist folder”还是“dest folder”?(“dist”可能是分发(或分发)和目的地的缩写,分别) - Peter Mortensen
3个回答

7

使用PyInstaller将Python Scrapy转换为EXE文件中讨论了一个非常相似的问题。

最初,我使用了auto-py-to-exe包(实际上是PyInstaller的图形用户界面)。
我在auto-py-to-exe ->高级设置 ->隐藏导入中添加了以下行:

scrapy.spiderloader,scrapy.statscollectors,scrapy.logformatter,scrapy.extensions,scrapy.extensions.corestats,scrapy.extensions.corestats,scrapy.extensions.telnet,scrapy.extensions.memusage,scrapy.extensions.memdebug,scrapy.extensions.closespider,scrapy.extensions.feedexport,scrapy.extensions.logstats,scrapy.extensions.spiderstate,scrapy.extensions.throttle,scrapy.core.scheduler,scrapy.squeues,queuelib,scrapy.core.downloader,scrapy.downloadermiddlewares,scrapy.downloadermiddlewares.robotstxt,scrapy.downloadermiddlewares.httpauth,scrapy.downloadermiddlewares.downloadtimeout,scrapy.downloadermiddlewares.defaultheaders,scrapy.downloadermiddlewares.useragent,scrapy.downloadermiddlewares.retry,scrapy.downloadermiddlewares.ajaxcrawl,scrapy.downloadermiddlewares.redirect,scrapy.downloadermiddlewares.httpcompression,scrapy.downloadermiddlewares.redirect,scrapy.downloadermiddlewares.cookies,scrapy.downloadermiddlewares.httpproxy,scrapy.downloadermiddlewares.stats,scrapy.downloadermiddlewares.httpcache,scrapy.spidermiddlewares,scrapy.spidermiddlewares.httperror,scrapy.spidermiddlewares.offsite,scrapy.spidermiddlewares.referer,scrapy.spidermiddlewares.urllength,scrapy.spidermiddlewares.depth,scrapy.pipelines,scrapy.dupefilters,scrapy.core.downloader.handlers.datauri,scrapy.core.downloader.handlers.file,scrapy.core.downloader.handlers.http,scrapy.core.downloader.handlers.s3,scrapy.core.downloader.handlers.ftp,scrapy.core.downloader.webclient,scrapy.core.downloader.contextfactory

在那之后,最后一个文本框中出现了以下命令(别忘记将路径更改为你的脚本):
pyinstaller -y -F --hidden-import scrapy.spiderloader --hidden-import scrapy.statscollectors --hidden-import scrapy.logformatter --hidden-import scrapy.extensions --hidden-import scrapy.extensions.corestats --hidden-import scrapy.extensions.corestats --hidden-import scrapy.extensions.telnet --hidden-import scrapy.extensions.memusage --hidden-import scrapy.extensions.memdebug --hidden-import scrapy.extensions.closespider --hidden-import scrapy.extensions.feedexport --hidden-import scrapy.extensions.logstats --hidden-import scrapy.extensions.spiderstate --hidden-import scrapy.extensions.throttle --hidden-import scrapy.core.scheduler --hidden-import scrapy.squeues --hidden-import queuelib --hidden-import scrapy.core.downloader --hidden-import scrapy.downloadermiddlewares --hidden-import scrapy.downloadermiddlewares.robotstxt --hidden-import scrapy.downloadermiddlewares.httpauth --hidden-import scrapy.downloadermiddlewares.downloadtimeout --hidden-import scrapy.downloadermiddlewares.defaultheaders --hidden-import scrapy.downloadermiddlewares.useragent --hidden-import scrapy.downloadermiddlewares.retry --hidden-import scrapy.downloadermiddlewares.ajaxcrawl --hidden-import scrapy.downloadermiddlewares.redirect --hidden-import scrapy.downloadermiddlewares.httpcompression --hidden-import scrapy.downloadermiddlewares.redirect --hidden-import scrapy.downloadermiddlewares.cookies --hidden-import scrapy.downloadermiddlewares.httpproxy --hidden-import scrapy.downloadermiddlewares.stats --hidden-import scrapy.downloadermiddlewares.httpcache --hidden-import scrapy.spidermiddlewares --hidden-import scrapy.spidermiddlewares.httperror --hidden-import scrapy.spidermiddlewares.offsite --hidden-import scrapy.spidermiddlewares.referer --hidden-import scrapy.spidermiddlewares.urllength --hidden-import scrapy.spidermiddlewares.depth --hidden-import scrapy.pipelines --hidden-import scrapy.dupefilters --hidden-import scrapy.core.downloader.handlers.datauri --hidden-import scrapy.core.downloader.handlers.file --hidden-import scrapy.core.downloader.handlers.http --hidden-import scrapy.core.downloader.handlers.s3 --hidden-import scrapy.core.downloader.handlers.ftp --hidden-import scrapy.core.downloader.webclient --hidden-import scrapy.core.downloader.contextfactory "C:/path/script.py"

如果之后,你的命令返回: ImportError: No module named 'modulename' - 将缺少的模块添加到隐藏导入并使用新的扩展隐藏导入重复此过程。
(我重复了这个过程48次,以获得一个可工作的EXE文件(并获得子模块列表)!!)

更新

在2019年11月12日(发布此答案后约6个月)pyinstaller添加了解决这个特定导入错误的hooks https://github.com/pyinstaller/pyinstaller/pull/4514/files

该pull请求的内容指向pyinstaller,指出了这个stackoverflow问题 No such file or directory error using pyinstaller and scrapy

在这个阶段,尝试从scrapy应用程序创建exe的开发人员最有可能遇到的问题是 Error after running .exe file originating from scrapy project 这是一个完全不同的问题。


这些命令行非常长(分别为1490和2296个字符)。并非所有的命令行处理器都能够处理它们。难道没有更好的解决方法吗? - Peter Mortensen
我对此进行了重新审查,发现我的回答内容已经过时。我已经更新了回答。 - Georgiy
我对此进行了重新审查,发现我的回答内容已经过时。我已经更新了回答。 - undefined

1

我在 spec 文件中使用 --hidden imports 解决了这个问题。 PyInstaller 不支持 Scrapy 中所有二级模块的导入。

运行 PyInstaller 命令。只需更新 spec 文件,添加以下隐藏导入更改即可:

hiddenimports=['scrapy.spiderloader','scrapy.statscollectors','scrapy.logformatter','scrapy.extensions','scrapy.extensions.logstats', 'scrapy.extensions.corestats','scrapy.extensions.memusage','scrapy.extensions.feedexport','scrapy.extensions.memdebug', 'scrapy.extensions.closespider','scrapy.extensions.throttle','scrapy.extensions.telnet','scrapy.extensions.spiderstate', 'scrapy.core.scheduler','scrapy.core.downloader','scrapy.downloadermiddlewares','scrapy.downloadermiddlewares.robotstxt', 'scrapy.downloadermiddlewares.httpauth','scrapy.downloadermiddlewares.downloadtimeout','scrapy.downloadermiddlewares.defaultheaders', 'scrapy.downloadermiddlewares.useragent','scrapy.downloadermiddlewares.retry','scrapy.core.downloader.handlers.http', 'scrapy.core.downloader.handlers.s3','scrapy.core.downloader.handlers.ftp','scrapy.core.downloader.handlers.datauri', 'scrapy.core.downloader.handlers.file','scrapy.downloadermiddlewares.ajaxcrawl','scrapy.core.downloader.contextfactory', 'scrapy.downloadermiddlewares.redirect','scrapy.downloadermiddlewares.httpcompression','scrapy.downloadermiddlewares.cookies', 'scrapy.downloadermiddlewares.httpproxy','scrapy.downloadermiddlewares.stats','scrapy.downloadermiddlewares.httpcache', 'scrapy.spidermiddlewares','scrapy.spidermiddlewares.httperror','scrapy.spidermiddlewares.offsite','scrapy.spidermiddlewares.referer', 'scrapy.spidermiddlewares.urllength','scrapy.spidermiddlewares.depth','scrapy.pipelines','scrapy.dupefilters','queuelib', 'scrapy.squeues',]

已修复了45个模块导入问题。使用--onefile可以帮助在单个可执行文件中运行Scrapy项目。


0

按照最新文档的指导,将您的Scrapy爬虫转换为Python脚本!

按照通常的PyInstaller命令制作可执行文件(确保您是在Scrapy项目内部运行它)。

    pyinstaller --onefile filename.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接