Help us understand the problem. What is going on with this article?

ScrapyをPyinstallerでexe化する

More than 1 year has passed since last update.

概要

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

最後に

もしお気づきの点などありましたらご指摘ください。
ありがとうございました。

Adolfoi
ソフトウェアエンジニアです。 iOSアプリを開発しています。 Pythonも使えます。
https://adolfoi.info/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away