python打包实战:⽤pyinstaller打包scrapy成单个可执⾏⽂件前⾔
写好的python程序要打包成windows的可执⾏⽂件,⼀般都是⽤pyinstaller。⽐如你要对test.py这个⽂件打包,⼀般的pyinstaller -F test.py就可以了。还有另⼀种⽤法,就是⽤spec⽂件,spec⽂件其实就相当于⼀个打包的架构⽂件,⾥⾯写了要怎么打包,类似于docker中的DockerFile。其实在⽤pyinstaller -F test.py这种⽅式打包的时候,程序也是先⽣成spec⽂件的,再次打包的时候我们就可以直接pyinstaller test.spec就可以了。
scrapy爬⾍⽂件打包
我的⽬录结构
外层⽂件夹是qiaofenqi,⾥⾯⼀层是qiaofenqi和scrapy.cfg⽂件,爬⾍⽂件都写在qiaofenqi⽂件夹⾥。
平时我们运⾏scrapy爬⾍的时候,都是在命令⾏⾥⽤scrapy crawl +爬⾍名这种⽅式,打包的话肯定不能⽤这种⽅式调⽤了,其实scrapy 爬⾍是可以⽤python程序直接调⽤的,我们打包的思路就是写⼀个py⽂件来调⽤爬⾍,并把这个py⽂件和爬⾍打包到⼀起。
打包步骤:
1.在scrapy.cfg⽂件同⼀层,新建⼀个py⽂件,这⾥我们起名为
# -*- coding: utf-8 -*-
awler 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
sions.spiderstate
stats
lnet
sions.logstats
usage
debug
sions.feedexport
sions.closespider
sions.debug
sions.httpcache
sions.statsmailer
sions.throttle
scheduler
ngine
scraper
spidermw
downloader
downloader
import scrapy.downloadermiddlewares.stats
import scrapy.downloadermiddlewares.httpcache
import kies
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 direct
import
import botstxt
import scrapy.spidermiddlewares.depth
import scrapy.spidermiddlewares.httperror
import scrapy.spidermiddlewares.offsite
import ferer
import scrapy.spidermiddlewares.urllength
import scrapy.pipelines
downloader.handlers.http
tfactory
# ⾃⼰项⽬⽤到的
import openpyxl # ⽤到openpyxl库
import json
import time
import os
process = CrawlerProcess(get_project_settings())
# 'credit'替换成你⾃⼰的爬⾍名
process.start() # the script will block here until the crawling is finished
在crawl.py⽂件⾥,最下⾯3⾏代码就是scrapy官⽅给的运⾏爬⾍的⽅法,上⾯的全都是依赖的引⼊,
因为打包的时候肯定是要把python 的依赖包全都打进去的,我们这⾥只是对这⼀个py⽂件打包,所以只能是在这⾥把整个爬⾍⽂件需要的依赖全部导⼊,包括scrapy的全部包和你⾃⼰⽂件中需要⽤到的依赖包。这时候你直接运⾏crawl.py这个⽂件,也就调起了你的爬⾍。
2.对crawl.py进⾏打包
为了过程好理解,我们先不管三七⼆⼗⼀直接对crawl.py进⾏打包,有问题再处理。
pyinstaller -F crawl.py
-F参数是指打成单个exe⽂件,其他参数⾃⼰查资料,这⾥不多做介绍。可以看到是可以打包成功的,dist⽂件中出现了⽂件,这时候你运⾏这个exe⽂件,发现是运⾏不成功的,直接把exe拖进cmd窗⼝运⾏,报的错误是
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\ADMINI~1\\Ap
pData\\Local\\Temp\\_MEI77122\\scrapy\\VERSION'
少VERSION⽂件,这个VERSION⽂件其实是你安装的scrapy模块下的⼀个⽂件,在安装⽬录是可以到的,⽐如我的scrapy⽂件都安装在这个⽬录下D:\Program Files\python374\Lib\site-packages\scrapy。
既然是少了这个⽂件,我们只要把这个⽂件加⼊我们的打包⽂件中就可以了,可以⽤–add-data参数加,也可以在spec⽂件中直接配置,因为你执⾏了pyinstaller命令,在你的⽬录下已经⽣成了crawl.spec⽂件,为了⽅便,我们直接修改crawl.spec这个⽂件。然后这⾥其实还缺另⼀个pes⽂件,也是相同⽬录下的,这⾥就不演⽰错误了,直接加了spec⽂件中。其实可以看出来就是你在crawl.py中把所有的scrapy模块都引⼊了,就这两个⽂件没引⼊,所以会报不到这两个⽂件的错误。
另外,因为我们是⽤crawl.py来调爬⾍⽂件,所以爬⾍⽂件也是要打包进我们的exe⽂件中的,所以在spec⽂件中也要加⼊爬⾍⽂件。
修改后的spec⽂件
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['crawl.py'],
pathex=['C:\\Users\\Administrator\\Desktop\\qiaofenqi'],
binaries=[],
datas=[('D:\\Program Files\\python374\\Lib\\site-packages\\scrapy\\pes','scrapy'),
('D:\\Program Files\\python374\\Lib\\site-packages\\scrapy\\VERSION','scrapy'),
('.','.' )],
hiddenimports=[],
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)
scraperexe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='crawl',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
主要改的地⽅就是datas参数,就是你要加⼊打包的资源⽂件,⼀看其实就明⽩,pes放到scrapy⽂件夹下,VERSION放到scrapy⽂件夹下,(’.’,’.’ )就是把当前⽬录放到打包后的根路径下,其实就是把整个爬⾍⽂件打包进去。
这样就可以重新打包了,打包之前记得把上次产⽣的build和dist⽂件夹删掉,因为这⾥直接⽤的(’.’,’.’ )把整个⽂件都加了打包⽂件⾥了(乐意的话可以只把py⽂件加⼊datas,但⽬录结构不能变),会把build和dist也打进去,造成exe⽂件很⼤。
重新打包就可以⽤你改好的spec⽂件了
pyinstaller crawl.spec
打包成功,进⼊dist,运⾏也没有问题。
但这还没完,如果你把exe⽂件拷贝到其他的地⽅,再运⾏,发现还是报错,爬⾍不到
KeyError: 'Spider not found: credit'
其实打包的过程是没错的,但爬⾍运⾏是要依赖scrapy.cfg这个配置⽂件的,只要把原来爬⾍⽂件夹⾥的scrapy.cfg复制⼀下,和exe⽂件放到同⽬录下就可以了。也就是说你发放你的exe⽂件的时候要和scrapy.cfg⼀起的。
⼤功告成!
总结⼀下
1.编写⼀个py⽂件⽤来调⽤爬⾍,并导⼊所有的依赖
2.编写spec⽂件,引⼊其它的资源⽂件。不喜欢⽤spec⽂件的可以⽤add-data参数。
3.⽤spec打包。
4.把exe和scrapy.cfg⼀起发布。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。