#概要
Pyinstallerでexe化まではできたが、exeファイルを起動するとクラッシュした。
完全に動作させる方法が分かったのでメモする。
#環境
OS:Windows 10
言語:Python3.7
scrapyバージョン:1.7.3
#前提
scrapyのspiderを作成済みで、さらにscrapyファイルを動かすスクリプトファイルがあること。
下記のような構成
demo_scrapy/
├── scrapy.cfg
├── lauch_demo.py ←これがscrapyファイルを動かすスクリプトファイル
└── demo_scrapy
├── init.py
├── pycache
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── init.py
├── demo_spider.py
└── pycache
lauch_demo.pyの中身
import datetime
import time
from scrapy.spiderloader import SpiderLoader
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
now = datetime.datetime.now()
dt_now_date = now.strftime("%Y-%m-%d-%H%M%S")
settings = get_project_settings()
settings.set('FEED_URI', 'demo' + '_' + dt_now_date + '.csv')
process = CrawlerProcess(settings)
process.crawl('demo_spider', domain='demo.com')
process.start() # the script will block here until the crawling is finished
print("完了しました")
#問題点
ここで、通常通りlaunch_demo.pyを起動すると正常に動作するが、
ただPyinstallerでexe化してもexeファイルは動かない。
下記の方法を実行する。
#解決方法
1.VERSION と mime.types ファイルをscrapyフォルダを任意の場所に作りそこに保存しておく。
VERSIONとmime.typesは
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\scrapy
に保存されている。
2.hidden-importを追加する。
コマンドプロンプトにて
pyinstaller --hidden-import scrapy.spiderloader --hidden-import scrapy.statscollectors --hidden-import scrapy.logformatter --hidden-import scrapy.extensions --hidden-import scrapy.extensions.corestats --hidden-import scrapy.extensions.corestats --hidden-import scrapy.extensions.telnet --hidden-import scrapy.extensions.memusage --hidden-import scrapy.extensions.memdebug --hidden-import scrapy.extensions.closespider --hidden-import scrapy.extensions.feedexport --hidden-import scrapy.extensions.logstats --hidden-import scrapy.extensions.spiderstate --hidden-import scrapy.extensions.throttle --hidden-import scrapy.core.scheduler --hidden-import scrapy.squeues --hidden-import queuelib --hidden-import scrapy.core.downloader --hidden-import scrapy.downloadermiddlewares --hidden-import scrapy.downloadermiddlewares.robotstxt --hidden-import scrapy.downloadermiddlewares.httpauth --hidden-import scrapy.downloadermiddlewares.downloadtimeout --hidden-import scrapy.downloadermiddlewares.defaultheaders --hidden-import scrapy.downloadermiddlewares.useragent --hidden-import scrapy.downloadermiddlewares.retry --hidden-import scrapy.downloadermiddlewares.ajaxcrawl --hidden-import scrapy.downloadermiddlewares.redirect --hidden-import scrapy.downloadermiddlewares.httpcompression --hidden-import scrapy.downloadermiddlewares.redirect --hidden-import scrapy.downloadermiddlewares.cookies --hidden-import scrapy.downloadermiddlewares.httpproxy --hidden-import scrapy.downloadermiddlewares.stats --hidden-import scrapy.downloadermiddlewares.httpcache --hidden-import scrapy.spidermiddlewares --hidden-import scrapy.spidermiddlewares.httperror --hidden-import scrapy.spidermiddlewares.offsite --hidden-import scrapy.spidermiddlewares.referer --hidden-import scrapy.spidermiddlewares.urllength --hidden-import scrapy.spidermiddlewares.depth --hidden-import scrapy.pipelines --hidden-import scrapy.dupefilters --hidden-import scrapy.core.downloader.handlers.datauri --hidden-import scrapy.core.downloader.handlers.file --hidden-import scrapy.core.downloader.handlers.http --hidden-import scrapy.core.downloader.handlers.s3 --hidden-import scrapy.core.downloader.handlers.ftp --hidden-import scrapy.core.downloader.webclient --hidden-import scrapy.core.downloader.contextfactory "C:/path/to/launch_demo.py"
を実行する。もし「module not found XXX」と出たら、--hidden-import XXXを追加する。
3.作成された.\dist\lauch_demo\ のフォルダの中に1で作ったscrapyフォルダを格納する。
4.exeファイルを実行するとうまくいく。
#参考文献
How to create a single executable file in windows 10 with scrapy and pyinstaller?
https://stackoverflow.com/questions/55331478/how-to-create-a-single-executable-file-in-windows-10-with-scrapy-and-pyinstaller
Pyinstaller scrapy error:
https://stackoverflow.com/questions/25557693/pyinstaller-scrapy-error
#最後に
もしお気づきの点などありましたらご指摘ください。
ありがとうございました。