寫好的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文件,這里我們起名為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 openpyxl # 用到openpyxl庫
import json
import time
import os
process = CrawlerProcess(get_project_settings())
# 'credit'替換成你自己的爬蟲名
process.crawl('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文件中出現了crawl.exe文件,這時候你運行這個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這個文件。然后這里其實還缺另一個mime.types文件,也是相同目錄下的,這里就不演示錯誤了,直接加了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\\mime.types','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)
exe = 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參數,就是你要加入打包的資源文件,一看其實就明白,mime.types放到scrapy文件夾下,VERSION放到scrapy文件夾下,('.','.' )就是把當前目錄放到打包后的根路徑下,其實就是把整個爬蟲文件打包進去。
這樣就可以重新打包了,打包之前記得把上次產生的build和dist文件夾刪掉,因為這里直接用的('.','.' )把整個文件都加了打包文件里了(樂意的話可以只把py文件加入datas,但目錄結構不能變),會把build和dist也打進去,造成exe文件很大。
重新打包就可以用你改好的spec文件了
pyinstaller crawl.spec
我在打包crawl.spec文件的時候卡在了Building PKG (CArchive) PKG-00.pkg
這個步驟,我的解決方式是刪除現有的build和dist目錄,打包crawl.spec的時候會再生成
打包成功,進入dist,運行crawl.exe也沒有問題。
但這還沒完,如果你把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一起發布。
轉自:https://www.toutiao.com/i6724222949949178382/?wid=1635049563421