Pyinstaller打包scrapy


環境

Windows7

Python3.65

scrapy1.74

PyInstaller3.5

 

創建打包腳本

在與scrapy.cfg同路徑創建start.py

# -*- coding: utf-8 -*-
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

 

# 必加的依賴

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 scrapy.core.downloader.handlers.file
import scrapy.core.downloader.handlers.ftp
import scrapy.core.downloader.handlers.datauri
import scrapy.core.downloader.handlers.s3

 
         

process = CrawlerProcess(get_project_settings())

# 參數1:爬蟲名 參數2:域名

process.crawl('biqubao_spider',domain='biqubao.com')
process.start() # the script will block here until the crawling is finished
input()

 


打包
pyinstaller start.py

打包完成后生成了三個文件:dist,build(可刪),start.spec(可刪)

問題1:
關於導入robotparser庫這個問題,本文參考的文章是導入了這個庫,可是經過嘗試后發現沒有安裝這個庫。
Scrapy會自動解析機器人協議的,所以嘗試不導入這個庫發現可以成功打包。

問題2:
可能你的Scrapy項目有使用其他的庫,所以在這個打包腳本上你需要導入你使用的所有庫。

問題3:
打包成功后運行不了程序,因為少兩個問題,如下圖

你需要在dist中添加scrapy文件夾,里面包含這兩個文件,這兩個文件在安裝的scrapy的庫中。


打包單文件

打包單文件需要修改spec文件的datas數據,添加pyinstaller不能識別的文件
其中
('.','.')如果不增加的話,在移動可執行文件時就會報錯,這個其實就是將當前目錄放到打包后的根路徑下(整個爬蟲文件打包進去,使得可執行文件更大)
 
        
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['start.py'],
             pathex=['G:\\1\\spider\\BookSpider'],
             binaries=[],
             datas=[('G:\\1\\spider\\BookSpider\\VERSION','scrapy'),('G:\\1\\spider\\BookSpider\\mime.types','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='start',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )
刪除生成的dict和build文件后運行
pyinstaller -F start.py start.exe

  發現此時沒有報錯了(如果不修改spec文件打包單文件會報錯)

 

發現了另外一個問題,當文件移動時還是會報錯

其實已經打包完成了,只需要把可執行文件與scrapy.cfg放一起就行




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM