PyInstaller打包Scrapy+PyQt5+selenium解決問題

 

首先,打包命令去掉所有不必要附加選項:比如 pyInstaller main.py -y

項目目錄結構:

說明一下打包遇到的問題:

1.打包PyQt5缺少Qt動態庫

2.Scrapy VERSION 文件不存在

3.打包Scrapy爬蟲缺少各種scrapy模塊(scrapy自己定義的pipelines,middlewares,settings)

4.缺少配置文件(這裏我自己有定義一個config.ini的配置文件,以及chromedriver.exe)

5.scrapy 自己定義的pipelines,middlewares,settings無效

解決方法:(注意文中圖片的備註)

1.添加以下代碼到入口文件引入PyQt5模塊的上方:

import sys, os
if hasattr(sys, 'frozen'):
    os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']

2.在解決第一個問題後,項目中使用了scrapy爬蟲的框架,所以會報一個錯誤;如下:

FileNotFoundError: [Errno 2] No such file or directory:'C:\\Users\\LENOVO\\Desktop\\SEO\\main\\scrapy\\VERSION'
[10816] Failed to execute script main

這裏表示缺失文件C:\\Users\\LENOVO\\Desktop\\SEO\\main\\scrapy\\VERSION;

檢查桌面SEO\main文件夾中是否缺少VERSION文件或缺少scrapy文件夾(一般情況下都是缺少的:缺少就先創建scrapy文件夾);

接下來我們去到Scrapy的安裝目錄D:\soft\Anaconda3\envs\python36\Lib\site-packages\scrapy(我這裏是這個目錄),將mime.types以及VERSION文件複製到桌面上SEO\main\scrapy文件夾中

3.解決上一步後,自己可以測試一下,測試後會出現缺少scrapy模塊的問題,這裏直接貼代碼了

# 這裏是必須引入的
# 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.settings
import scrapy.middleware

import scrapy.core.downloader.handlers.http
import scrapy.core.downloader.contextfactory
import scrapy.core.downloader.handlers.ftp
import scrapy.core.downloader.handlers.s3
import scrapy.core.downloader.handlers.file
import scrapy.core.downloader.handlers.datauri

這寫代碼直接添加到模塊引入代碼的最後即可;提一句 如果你還有用到其它模塊請自行導入

4.因爲程序中用到數據庫,所以將數據庫配置寫在config.ini中;以及使用到了Chrome瀏覽器;所以這兩個配置文件也需要複製到桌面文件夾中;

這裏就不多說了,這個可以打印一下自己使用配置文件的實際路徑,然後將配置文件放到相應的文件夾下面,比如config.ini 在database.py中用到,打印路徑後顯示的相對路徑爲myseo\database.py;所以,我們需要在SEO\main\中新建myseo文件夾,然後將config.ini複製到SEO\main\myseo文件夾中(這裏注意,一定以你自己的路徑爲準)

5.如果以上4步都已經解決,你的程序應該可以正常運行起來了,但是你會發現,我們自己定義的中間件,以及數據操作都不會生效,這裏是因爲我們定義的爬蟲規則都在settings中配置的,而在打包的時候,沒有找到我們配置的settings,所以pipelines,middlewares會不生效

首先,我們將scrapy.cfg文件複製到SEO\main中。爲什麼複製它,因爲cfg文件中指定了我們配置的settings配置文件的相對路徑;內容如下:

# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html

[settings]
default = myseo.settings

[deploy]
#url = http://localhost:6800/
project = myseo

到這裏還沒完。記得在第三步時提到需要其它模塊需要自己導入;所以這裏就需要導入我們用到的模塊,也就是我們自己定義的pipelines,middlewares;接着導入:

import myseo.settings
import myseo.middlewares
import myseo.pipelines

以上5個問題,5個解決步驟到此就完了,程序啓動,運行正常;如果你有遇到以上問題,可以參考我的解決方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章