我正在尝试将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
答案 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文件。