使用pyinstaller将python scrapy转换为exe文件

时间:2018-05-23 17:02:11

标签: python scrapy pyinstaller

我正在尝试将scrapy脚本转换为exe文件。 main.py文件如下所示:

from scrapy.crawler import CrawlerProcess
from amazon.spiders.amazon_scraper import Spider

spider = Spider()
process = CrawlerProcess({
    'FEED_FORMAT': 'csv',
    'FEED_URI': 'data.csv',
    'DOWNLOAD_DELAY': 3,
    'RANDOMIZE_DOWNLOAD_DELAY': True,
    'ROTATING_PROXY_LIST_PATH': 'proxies.txt',
    'USER_AGENT_LIST': 'useragents.txt',
    'DOWNLOADER_MIDDLEWARES' : 
    {
        'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
        'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
        'random_useragent.RandomUserAgentMiddleware': 400
    }
})

process.crawl(spider)
process.start() # the script will block here until the crawling is finished

scrapy脚本与其他任何内容一样。我正在使用pyinstaller.exe --onefile main.py将其转换为exe文件。当我尝试在dist文件夹中打开main.exe文件时,它开始输出错误:

FileNotFoundError: [Errno 2] No such file or directory: '...\\scrapy\\VERSION'

我可以通过在dist文件夹中创建一个scrapy文件夹并从lib / site-packages / scrapy上传一个VERSION文件来修复它。 之后,出现了许多其他错误,但我可以通过上传一些scrapy库来修复它们。

最后它开始输出错误:

ModuleNotFoundError: No module named 'email.mime'

我甚至不知道这是什么意思。我从未见过它。

我正在使用:

Python 3.6.5
Scrapy 1.5.0
pyinstaller 3.3.1

1 个答案:

答案 0 :(得分:1)

我也有同样的情况。
为了避免发生此错误,我决定检查并更改一些脚本代码,而不是让pyinstaller对该文件进行计数(我尝试进行此操作的所有尝试均失败了)。

我注意到在\scrapy\VERSION文件中只有一个地方使用\scrapy\__init__.py
我决定通过更改scrapy__init__.py从scrapy \ version硬编码该值。 :

#import pkgutil
__version__ = "1.5.0" #pkgutil.get_data(__package__, 'VERSION').decode('ascii').strip()
version_info = tuple(int(v) if v.isdigit() else v
                     for v in __version__.split('.'))
#del pkgutil

此更改后,无需将版本存储在外部文件中。 由于没有引用\ scrapy \ version文件,因此不会发生该错误。

此后,我的文件FileNotFoundError: [Errno 2]\scrapy\mime.types相同。
\ scrapy \ mime.types也有同样的情况-仅在\scrapy\responsetypes.py

中使用
...
#from pkgutil import get_data
...
    def __init__(self):
        self.classes = {}
        self.mimetypes = MimeTypes()
        #mimedata = get_data('scrapy', 'mime.types').decode('utf8')
        mimedata = """
        Copypaste all 750 lines of \scrapy\mime.types here
"""
        self.mimetypes.readfp(StringIO(mimedata))
        for mimetype, cls in six.iteritems(self.CLASSES):
            self.classes[mimetype] = load_object(cls)

此更改通过\ scrapy \ mime.types文件解决了FileNotFoundError: [Errno 2]。 我同意将750行文本硬编码到python代码中并不是最好的决定。

此后,我开始接收ModuleNotFoundError: No module named scrapy.spiderloader。我将"scrapy.spiderloader"添加到pyinstaller的隐藏imports参数中。
下一期ModuleNotFoundError: No module named scrapy.statscollectors
用于我的脚本脚本的pyinstaller命令的最终版本包含46个隐藏的导入-之后,我收到了工作的.exe文件。