【问题标题】:python scrapy conversion to exe file using pyinstallerpython scrapy 使用 pyinstaller 转换为 exe 文件
【发布时间】:2019-06-15 13:24:10
【问题描述】:

我正在尝试将 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

【问题讨论】:

标签: python scrapy pyinstaller


【解决方案1】:

我也有同样的情况。
我没有尝试让 pyinstaller 计算这个文件(我所有的尝试都失败了),而是决定检查并更改部分 scrapy 代码以避免此错误。

我注意到只有一个地方使用了\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 文件 - 不会发生该错误。

在那之后,我拥有与 \scrapy\mime.types 相同的 FileNotFoundError: [Errno 2] 文件。
\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。我在 pyinstaller 的隐藏导入参数中添加了"scrapy.spiderloader"
下一期ModuleNotFoundError: No module named scrapy.statscollectors
我的 scrapy 脚本的 pyinstaller 命令的最终版本包含 46 个隐藏导入 - 之后我收到了工作 .exe 文件。

【讨论】:

    猜你喜欢
    • 2020-12-05
    • 2016-08-03
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多