前置:https://www.cnblogs.com/luocodes/p/11827850.html

解决最后一个问题,如何将scrapy真正的打包成单文件

耗了一晚上时间,今天突然有灵感了

错误分析

不将scrapy.cfg文件与可执行文件放一起,那么就会报错---爬虫没有找到

报错的原因

1.scrapy.cfg文件放入不进可执行文件中

2.scrapy目录读取不到scrapy.cfg文件

问题1

pyinstaller是将可执行文件解压到系统的临时文件中,在进行运行的

所以我们只需要在可执行文件中找到它的目录就能了解我们打包的文件中到底包含了什么

这里还有一个问题,每当可执行文件运行完毕后,它产生的temp文件将会被删除,所以我们在start.py中加一下输入

这样一来程序不退出,临时文件也随之保留了下来,方便我们查看

  1. # -*- coding: utf-8 -*-
  2. from scrapy.cmdline import execute
  3. from scrapy.utils.python import garbage_collect
  4. from scrapy.crawler import CrawlerProcess
  5. from scrapy.utils.project import get_project_settings
  6.  
  7. # import robotparser
  8. import os
  9. import sys
  10. import scrapy.spiderloader
  11. import scrapy.statscollectors
  12. import scrapy.logformatter
  13. import scrapy.dupefilters
  14. import scrapy.squeues
  15.  
  16. import scrapy.extensions.spiderstate
  17. import scrapy.extensions.corestats
  18. import scrapy.extensions.telnet
  19. import scrapy.extensions.logstats
  20. import scrapy.extensions.memusage
  21. import scrapy.extensions.memdebug
  22. import scrapy.extensions.feedexport
  23. import scrapy.extensions.closespider
  24. import scrapy.extensions.debug
  25. import scrapy.extensions.httpcache
  26. import scrapy.extensions.statsmailer
  27. import scrapy.extensions.throttle
  28.  
  29. import scrapy.core.scheduler
  30. import scrapy.core.engine
  31. import scrapy.core.scraper
  32. import scrapy.core.spidermw
  33. import scrapy.core.downloader
  34.  
  35. import scrapy.downloadermiddlewares.stats
  36. import scrapy.downloadermiddlewares.httpcache
  37. import scrapy.downloadermiddlewares.cookies
  38. import scrapy.downloadermiddlewares.useragent
  39. import scrapy.downloadermiddlewares.httpproxy
  40. import scrapy.downloadermiddlewares.ajaxcrawl
  41. import scrapy.downloadermiddlewares.chunked
  42. import scrapy.downloadermiddlewares.decompression
  43. import scrapy.downloadermiddlewares.defaultheaders
  44. import scrapy.downloadermiddlewares.downloadtimeout
  45. import scrapy.downloadermiddlewares.httpauth
  46. import scrapy.downloadermiddlewares.httpcompression
  47. import scrapy.downloadermiddlewares.redirect
  48. import scrapy.downloadermiddlewares.retry
  49. import scrapy.downloadermiddlewares.robotstxt
  50.  
  51. import scrapy.spidermiddlewares.depth
  52. import scrapy.spidermiddlewares.httperror
  53. import scrapy.spidermiddlewares.offsite
  54. import scrapy.spidermiddlewares.referer
  55. import scrapy.spidermiddlewares.urllength
  56.  
  57. import scrapy.pipelines
  58.  
  59. import scrapy.core.downloader.handlers.http
  60. import scrapy.core.downloader.contextfactory
  61.  
  62. import scrapy.core.downloader.handlers.file
  63. import scrapy.core.downloader.handlers.ftp
  64. import scrapy.core.downloader.handlers.datauri
  65. import scrapy.core.downloader.handlers.s3
  66.  
  67. print(sys.path[0])
  68.  
  69. print(sys.argv[0])
  70.  
  71. print(os.path.dirname(os.path.realpath(sys.executable)))
  72.  
  73. print(os.path.dirname(os.path.realpath(sys.argv[0])))
  74. cfg=os.path.join(os.path.split(sys.path[0])[0],"scrapy.cfg")
  75. print(cfg)
  76. input()
  77.  
  78. process = CrawlerProcess(get_project_settings())
  79.  
  80. process.crawl('biqubao_spider',domain='biqubao.com')
  81. process.start() # the script will block here until the crawling is finished
  1. 经过尝试只有sys.path这个函数是获取到temp文件的位置.
  1. cfg这个变量就是我后来得出的scrapy.cfgtemp目录下的位置
  2.  
  3. 产生的temp文件如下:

temp文件中包含了cfg,我们继续测试一下,在temp文件中运行start.py文件,发现这里是可以正常运行的

那么问题所在就是scrapy读取不到cfg文件所产生的

问题2

如何让scrapy读取到cfg文件呢?

经过调试,我找到了一个scrapy读取cfg文件路径的函数

  1. #scrapy\utils\conf.py
    def get_sources(use_closest=True):
  2. xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or \
  3. os.path.expanduser('~/.config')
  4. sources = ['/etc/scrapy.cfg', r'c:\scrapy\scrapy.cfg',
  5. xdg_config_home + '/scrapy.cfg',
  6. os.path.expanduser('~/.scrapy.cfg')]
  7. if use_closest:
  8. sources.append(closest_scrapy_cfg())
  9. return sources

函数的sources 是一个cfg文件路径的数组

经过问题1的测试,那么我们这时候会想到了我们执行了单文件,导致了scrapy读取的是单文件路径下的cfg,而不是temp文件中的cfg

那么这时候只要在sources中添加单文件执行后产生的temp文件就能正确的读取到cfg文件了

  1. def get_sources(use_closest=True):
  2. xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or \
  3. os.path.expanduser('~/.config')
  4. sources = ['/etc/scrapy.cfg', r'c:\scrapy\scrapy.cfg',
  5. xdg_config_home + '/scrapy.cfg',
  6. os.path.expanduser('~/.scrapy.cfg'),os.path.join(os.path.split(sys.path[0])[0],"scrapy.cfg")]
  7. if use_closest:
  8. sources.append(closest_scrapy_cfg())
  9. return sources

重新打包,发现移动单个的可执行文件也不会报错了!

真正的打包scrapy单文件(不包含cfg)的更多相关文章

  1. webpack打包vue单文件组件

    一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...

  2. maven打包可以行文件,包含依赖包等

    <build> <!-- 设定打包的名称 --> <finalName>ismp2xy</finalName> <plugins> < ...

  3. .NET5.0 单文件发布打包操作深度剖析

    .NET5.0 单文件发布打包操作深度剖析 前言 随着 .NET5.0 Preview 8 的发布,许多新功能正在被社区成员一一探索:这其中就包含了"单文件发布"这个炫酷的功能,实 ...

  4. [原创] 绿色单文件封装程序GreenOne V3.0

    1.原理 将包含可执行文件的多个文件 调用Winrar,创建自解压格式压缩文件 设置高级自解压选项中的文本和图标,设置解压后运行的文件为选中的可执行文件. 这种创建单文件封装其实也就是一个Winrar ...

  5. AOT和单文件发布对程序性能的影响

    前言 这里先和大家介绍一下.NET一些发布的历史,以前的.NET框架原生并不支持最终编译结果的单文件发布(需要依赖第三方工具),我这里新建了一个简单的ASP.NET Core项目,发布以后的目录就会像 ...

  6. 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片)

    解决 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片) 1.当我们写了一个Python的项目时,特别是一个GUI项目,我们特备希望它能成为一个在Windows系统可执行的EXE文件 ...

  7. 《DotNet Web应用单文件部署系列》二、打包wwwroot文件夹

    在这篇文章中,你将学到web缓存规则,文件传输中用到的压缩格式,以及如何手写代码响应请求.最后还能学到快速打包wwwroot文件夹组件用法. 一.了解Response Header 当第一次加载程序时 ...

  8. 软件打包为exe NSIS单文件封包工具V2.3

    NSIS单文件封包工具V2.3 这是一款基于NSIS模块的封包制作工具,lzma算法最大压缩率,支持制作单文件,以及NSIS自定义解压封包. 支持注册dll,exe,reg,bat文件 默认提取设置程 ...

  9. QT发布的EXE打包压缩成单文件

    Enigma virtual box 是免费的软件虚拟化工具,它可以将多个文件封装到您的应用程序主文件,这样您的软件就可以制作成为单文件的绿色软件. enigma virtual box 支持所有类型 ...

随机推荐

  1. $(document).height 与$(window).height的区别

    $(document).scrollTop() 获取垂直滚动的距离 (即当前滚动的地方的窗口顶端到整个页面顶端的距离)$(document).scrollLeft() 这是获取水平滚动条的距离 要获取 ...

  2. PHP 微信机器人 Vbot 结合 Laravel 基础入门及实例

    新来了项目,需要能监听指定微信群的消息并进行转发.基于 PHP 7 的 web 微信机器人 Vbot 可以满足需求.Vbot 本质上就是实现了登录网页版微信来进行自动回复.群管理等等操作. githu ...

  3. DrawerLayout(抽屉效果)

    DrawerLayout是V4包下提供的一种左滑右滑抽屉布局效果. 实现效果如下: 因为是官方提供的,所以使用起来也相对的比较简单. DrawerLayout 提供 1.当界面弹出的时候,主要内容区会 ...

  4. ASP.NET Web API 2系列(二):灵活多样的路由配置

    1. 导言 路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的在于利用注册的路由对请求的URL进行解析以确定目标HTTPController和Action的名称, ...

  5. 选择高性能NoSQL数据库的5个步骤

    来源:Redislabs作者:Shabih Syed 翻译:Kevin (公众号:中间件小哥) 构建在线和运营应用程序的开发团队越来越多地选择一类新的数据库来支持它们.它被称为“NoSQL”或“Not ...

  6. HashTable、Dictionary、ConcurrentDictionary三者区别

    转载自https://blog.csdn.net/yinghuolsx/article/details/72952857 1.HashTable HashTable表示键/值对的集合.在.NET Fr ...

  7. wampserver 运行橙色,80端口没有被占用,查看错误日志方法

    wampserver运行时橙色,经检查80端口并没有被占用,试了很多种方法都无效,去查看错误日志吧 1.以管理员身份打开CMD 注意这里必须是管理员身份的CMD ,powershell不行的 进入wa ...

  8. 配置code::blocks的glut环境

    code::blocks很小,特别适合小型项目及家用旧电脑上MingW下编程,当然windows还是安装的Visual Studio办公用的,现把配置过程记录一遍. 1.在百度搜code::block ...

  9. 计算机网络知识点总结2:IP协议(IPV4)

    一.Internet网络是一种数据报网络(另一种是虚电路网络,用于ATM等),主要功能是路由和转发. 二.IP数据报(分组)格式(IPV4版本) 首部 描述 版本号(4bit) 描述IP协议的版本号, ...

  10. Vue躬行记(3)——样式和表单

    Vue对DOM元素的class和style两个特性做了专门的增强,即对CSS类和内联样式做了一层封装,通过v-bind指令来处理它们,而接收的表达式既可以是简单的字符串.对象或数组,也可以是复杂的计算 ...