真正的打包scrapy單文件(不包含cfg)


前置:https://www.cnblogs.com/luocodes/p/11827850.html

 

解決最后一個問題,如何將scrapy真正的打包成單文件

耗了一晚上時間,今天突然有靈感了

 

錯誤分析

不將scrapy.cfg文件與可執行文件放一起,那么就會報錯---爬蟲沒有找到

報錯的原因

1.scrapy.cfg文件放入不進可執行文件中

2.scrapy目錄讀取不到scrapy.cfg文件

 

問題1

pyinstaller是將可執行文件解壓到系統的臨時文件中,在進行運行的

所以我們只需要在可執行文件中找到它的目錄就能了解我們打包的文件中到底包含了什么

這里還有一個問題,每當可執行文件運行完畢后,它產生的temp文件將會被刪除,所以我們在start.py中加一下輸入

這樣一來程序不退出,臨時文件也隨之保留了下來,方便我們查看

# -*- coding: utf-8 -*-
from scrapy.cmdline import execute
from scrapy.utils.python import garbage_collect
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

# import robotparser
import os
import sys
import scrapy.spiderloader
import scrapy.statscollectors
import scrapy.logformatter
import scrapy.dupefilters
import scrapy.squeues
 
import scrapy.extensions.spiderstate
import scrapy.extensions.corestats
import scrapy.extensions.telnet
import scrapy.extensions.logstats
import scrapy.extensions.memusage
import scrapy.extensions.memdebug
import scrapy.extensions.feedexport
import scrapy.extensions.closespider
import scrapy.extensions.debug
import scrapy.extensions.httpcache
import scrapy.extensions.statsmailer
import scrapy.extensions.throttle
 
import scrapy.core.scheduler
import scrapy.core.engine
import scrapy.core.scraper
import scrapy.core.spidermw
import scrapy.core.downloader
 
import scrapy.downloadermiddlewares.stats
import scrapy.downloadermiddlewares.httpcache
import scrapy.downloadermiddlewares.cookies
import scrapy.downloadermiddlewares.useragent
import scrapy.downloadermiddlewares.httpproxy
import scrapy.downloadermiddlewares.ajaxcrawl
import scrapy.downloadermiddlewares.chunked
import scrapy.downloadermiddlewares.decompression
import scrapy.downloadermiddlewares.defaultheaders
import scrapy.downloadermiddlewares.downloadtimeout
import scrapy.downloadermiddlewares.httpauth
import scrapy.downloadermiddlewares.httpcompression
import scrapy.downloadermiddlewares.redirect
import scrapy.downloadermiddlewares.retry
import scrapy.downloadermiddlewares.robotstxt
 
import scrapy.spidermiddlewares.depth
import scrapy.spidermiddlewares.httperror
import scrapy.spidermiddlewares.offsite
import scrapy.spidermiddlewares.referer
import scrapy.spidermiddlewares.urllength
 
import scrapy.pipelines
 
import scrapy.core.downloader.handlers.http
import scrapy.core.downloader.contextfactory


import scrapy.core.downloader.handlers.file
import scrapy.core.downloader.handlers.ftp
import scrapy.core.downloader.handlers.datauri
import scrapy.core.downloader.handlers.s3

print(sys.path[0])

print(sys.argv[0])

print(os.path.dirname(os.path.realpath(sys.executable)))

print(os.path.dirname(os.path.realpath(sys.argv[0])))
cfg=os.path.join(os.path.split(sys.path[0])[0],"scrapy.cfg")
print(cfg)
input()

process = CrawlerProcess(get_project_settings())
 
process.crawl('biqubao_spider',domain='biqubao.com')
process.start()  # the script will block here until the crawling is finished

 

 

經過嘗試只有sys.path這個函數是獲取到temp文件的位置.
cfg這個變量就是我后來得出的scrapy.cfg在temp目錄下的位置

產生的temp文件如下:



 

temp文件中包含了cfg,我們繼續測試一下,在temp文件中運行start.py文件,發現這里是可以正常運行的

那么問題所在就是scrapy讀取不到cfg文件所產生的

 

問題2

如何讓scrapy讀取到cfg文件呢?

經過調試,我找到了一個scrapy讀取cfg文件路徑的函數

#scrapy\utils\conf.py
def
get_sources(use_closest=True): xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or \ os.path.expanduser('~/.config') sources = ['/etc/scrapy.cfg', r'c:\scrapy\scrapy.cfg', xdg_config_home + '/scrapy.cfg', os.path.expanduser('~/.scrapy.cfg')] if use_closest: sources.append(closest_scrapy_cfg()) return sources

函數的sources 是一個cfg文件路徑的數組

 

經過問題1的測試,那么我們這時候會想到了我們執行了單文件,導致了scrapy讀取的是單文件路徑下的cfg,而不是temp文件中的cfg

那么這時候只要在sources中添加單文件執行后產生的temp文件就能正確的讀取到cfg文件了

 

def get_sources(use_closest=True):
    xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or \
        os.path.expanduser('~/.config')
    sources = ['/etc/scrapy.cfg', r'c:\scrapy\scrapy.cfg',
               xdg_config_home + '/scrapy.cfg',
               os.path.expanduser('~/.scrapy.cfg'),os.path.join(os.path.split(sys.path[0])[0],"scrapy.cfg")]
    if use_closest:
        sources.append(closest_scrapy_cfg())
    return sources

 

重新打包,發現移動單個的可執行文件也不會報錯了!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM