用Pyinstaller打包Scrapy项目问题解决!!!(转载)

本文详细介绍了使用Pyinstaller将Scrapy爬虫项目打包为exe文件的过程及遇到的问题解决方案,包括缺失依赖、兼容性等问题。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

使用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

  1. from scrapy.crawler import CrawlerProcess
  2. from scrapy.utils.project import get_project_settings
  3. process = CrawlerProcess(get_project_settings())
  4. # 'followall' is the name of one of the spiders of the project.
  5. process.crawl('followall', domain='scrapinghub.com')
  6. process.start() # the script will block here until the crawling is finished
我就用了上面这段代码,将它放在crawl.py文件中(当然爬虫的名字要改掉)

然后开始用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进来。。。(这里花了我蛮久时间)

以下就是提示缺少的模块

  1. import robotparser
  2. import scrapy.spiderloader
  3. import scrapy.statscollectors
  4. import scrapy.logformatter
  5. import scrapy.dupefilters
  6. import scrapy.squeues
  7. import scrapy.extensions.spiderstate
  8. import scrapy.extensions.corestats
  9. import scrapy.extensions.telnet
  10. import scrapy.extensions.logstats
  11. import scrapy.extensions.memusage
  12. import scrapy.extensions.memdebug
  13. import scrapy.extensions.feedexport
  14. import scrapy.extensions.closespider
  15. import scrapy.extensions.debug
  16. import scrapy.extensions.httpcache
  17. import scrapy.extensions.statsmailer
  18. import scrapy.extensions.throttle
  19. import scrapy.core.scheduler
  20. import scrapy.core.engine
  21. import scrapy.core.scraper
  22. import scrapy.core.spidermw
  23. import scrapy.core.downloader
  24. import scrapy.downloadermiddlewares.stats
  25. import scrapy.downloadermiddlewares.httpcache
  26. import scrapy.downloadermiddlewares.cookies
  27. import scrapy.downloadermiddlewares.useragent
  28. import scrapy.downloadermiddlewares.httpproxy
  29. import scrapy.downloadermiddlewares.ajaxcrawl
  30. import scrapy.downloadermiddlewares.chunked
  31. import scrapy.downloadermiddlewares.decompression
  32. import scrapy.downloadermiddlewares.defaultheaders
  33. import scrapy.downloadermiddlewares.downloadtimeout
  34. import scrapy.downloadermiddlewares.httpauth
  35. import scrapy.downloadermiddlewares.httpcompression
  36. import scrapy.downloadermiddlewares.redirect
  37. import scrapy.downloadermiddlewares.retry
  38. import scrapy.downloadermiddlewares.robotstxt
  39. import scrapy.spidermiddlewares.depth
  40. import scrapy.spidermiddlewares.httperror
  41. import scrapy.spidermiddlewares.offsite
  42. import scrapy.spidermiddlewares.referer
  43. import scrapy.spidermiddlewares.urllength
  44. import scrapy.pipelines
  45. import scrapy.core.downloader.handlers.http
  46. import scrapy.core.downloader.contextfactory
  47. import scrapy.pipelines.images # 用到图片管道
  48. import openpyxl # 用到openpyxl库
注意最后有注释的两行,在我这个例子项目中我引入了openpyxl并且使用到了图片管道,如果你的项目中没有用到这两个的话则不需要import,当然你的项目可能会用到其他模块说不定。。。

上面没有注释的那些行应该就是要必须引入的了。

所以整个crawl.py文件看起来是这样的(为了方便看官区分,我加了一些注释)

  1. # -*- coding: utf-8 -*-
  2. from scrapy.crawler import CrawlerProcess
  3. from scrapy.utils.project import get_project_settings
  4. # 这里是必须引入的
  5. import robotparser
  6. import scrapy.spiderloader
  7. import scrapy.statscollectors
  8. import scrapy.logformatter
  9. import scrapy.dupefilters
  10. import scrapy.squeues
  11. import scrapy.extensions.spiderstate
  12. import scrapy.extensions.corestats
  13. import scrapy.extensions.telnet
  14. import scrapy.extensions.logstats
  15. import scrapy.extensions.memusage
  16. import scrapy.extensions.memdebug
  17. import scrapy.extensions.feedexport
  18. import scrapy.extensions.closespider
  19. import scrapy.extensions.debug
  20. import scrapy.extensions.httpcache
  21. import scrapy.extensions.statsmailer
  22. import scrapy.extensions.throttle
  23. import scrapy.core.scheduler
  24. import scrapy.core.engine
  25. import scrapy.core.scraper
  26. import scrapy.core.spidermw
  27. import scrapy.core.downloader
  28. import scrapy.downloadermiddlewares.stats
  29. import scrapy.downloadermiddlewares.httpcache
  30. import scrapy.downloadermiddlewares.cookies
  31. import scrapy.downloadermiddlewares.useragent
  32. import scrapy.downloadermiddlewares.httpproxy
  33. import scrapy.downloadermiddlewares.ajaxcrawl
  34. import scrapy.downloadermiddlewares.chunked
  35. import scrapy.downloadermiddlewares.decompression
  36. import scrapy.downloadermiddlewares.defaultheaders
  37. import scrapy.downloadermiddlewares.downloadtimeout
  38. import scrapy.downloadermiddlewares.httpauth
  39. import scrapy.downloadermiddlewares.httpcompression
  40. import scrapy.downloadermiddlewares.redirect
  41. import scrapy.downloadermiddlewares.retry
  42. import scrapy.downloadermiddlewares.robotstxt
  43. import scrapy.spidermiddlewares.depth
  44. import scrapy.spidermiddlewares.httperror
  45. import scrapy.spidermiddlewares.offsite
  46. import scrapy.spidermiddlewares.referer
  47. import scrapy.spidermiddlewares.urllength
  48. import scrapy.pipelines
  49. import scrapy.core.downloader.handlers.http
  50. import scrapy.core.downloader.contextfactory
  51. # 以下两行是我的项目有用到的
  52. import scrapy.pipelines.images # 用到图片管道
  53. import openpyxl # 用到openpyxl库
  54. process = CrawlerProcess(get_project_settings())
  55. # 'Books' is the name of one of the spiders of the project.
  56. process.crawl('Books')
  57. 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位的包。望知道的大神路过能指点一二。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值