python 打包Spider
使用 pyinstaller 打包
在网上搜索到最多的是用Pyinstaller打包Scrapy项目问题解决!!!
可是在mac os 上,不可以用,mac 上打包,只能打 unix 可执行文件 ,或者 app ,
以下以huaban项目为例(本人实际项目不是这一个,huaban只是从网上找的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ./root //主目录名,以root 代替
├── dist // 生产目录 ├── build // 编译目录 ├── huaban // scrapy项目 │ ├── spiders │ │ ├── huanbanspider.py//spider文件 │ ├── items.py │ ├── middlewares.py │ ├── pipelines.py │ └── settings.py ├── crawl.py // pyinstall打包入口 ├── crawl.spec // 打包spec文件 └── scrapy.cfg // scrapy配置
|
crawl.py 为打包入口文件
crawl.spec 为打包spec配置文件,在第一次 pyinstaller crawl.py 后自动生成
crawl.py 内容为:
1 2 3 4 5 6 7 8 9 10
| # -*- coding=UTF-8 -*- from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings from huaban.spiders.huabanspider import HuabanSpider
process = CrawlerProcess(get_project_settings())
process.crawl(HuabanSpider) process.start()
|
在终端中cd 到当前主目录
pyinstaller crawl.py
自动生成 crawl.spec 配置文件 , build 文件夹 和 dist 文件夹
此时运行 dist 文件夹中的可执行文件, 可能会报 ../sprapy/VERSION 文件找不到.
上网一顿操作后,找到次数最多的,就是文章上面所说的链接,可是在mac 下,不顶用啊~
不用慌,此雷我已踩完.
找到自己spider 文件的安装目录,复制两个文件到你的项目中,并自己创建一个叫scrapy的文件夹,放在里面.
此时,你的项目目录已经变成这样了.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ./root //主目录名,以root 代替
├── dist // 生产目录 ├── build // 编译目录 ├── huaban // scrapy项目 │ ├── spiders │ │ └── huanbanspider.py//spider文件 │ ├── items.py │ ├── middlewares.py │ ├── pipelines.py │ └── settings.py ├── crawl.py // pyinstall打包入口 ├── crawl.spec // 打包spec文件 ├── scrapy // 打包scrapy的文件 │ ├── mime.types │ └── VERSION └── scrapy.cfg // scrapy配置
|
修改crawl.spec 文件
1 2 3 4 5 6 7 8 9 10 11 12
| a = Analysis(['crawl.py'], pathex=['/Users/zhangkun/Documents/Study/tvmao'], binaries=[], datas=[('./scrapy', 'scrapy'),('./scrapy.cfg','.')], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False)
|
原
datas=[]
修改为
datas=[(‘./scrapy’, ‘scrapy’)]
修改完成后,继续打包
警告此时打包不要再用 pyinstaller crawl.py
使用pyinstaller crawl.spec
使用 pyinstaller crawl.py 会使 crawl.spec 文件替换为掉
让我们继续来打包吧
打完之后,运行文件,提示缺包
因为pyinstaller 无法导入隐形包,所以,要我们自己倒入
提示什么,导入什么
方法是 添加到hiddenimports=[]中
hiddenimports=[‘scrapy.statscollectors’]
继续打包,你会发现,又缺其他的东西…
让我们继续
经过数个小时之后.
hiddenimports=[] 已经完全变样了..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| hiddenimports=[ 'scrapy.spiderloader', 'urllib3', 'pymysql', 'scrapy.statscollectors', 'scrapy.logformatter', 'scrapy.dupefilters', 'scrapy.squeues',
'scrapy.extensions.spiderstate', 'scrapy.extensions.corestats', 'scrapy.extensions.telnet', 'scrapy.extensions.logstats', 'scrapy.extensions.memusage', 'scrapy.extensions.feedexport', 'scrapy.extensions.closespider', 'scrapy.extensions.debug', 'scrapy.extensions.httpcache', 'scrapy.extensions.statsmailer', 'scrapy.extensions.throttle', 'scrapy.extensions.memdebug',
'scrapy.core.scheduler', 'scrapy.core.engine', 'scrapy.core.scraper', 'scrapy.core.spidermw', 'scrapy.core.downloader', 'scrapy.downloadermiddlewares.stats', 'scrapy.downloadermiddlewares.httpcache', 'scrapy.downloadermiddlewares.cookies', 'scrapy.downloadermiddlewares.useragent', 'scrapy.downloadermiddlewares.httpproxy', 'scrapy.downloadermiddlewares.ajaxcrawl', 'scrapy.downloadermiddlewares.chunked', 'scrapy.downloadermiddlewares.decompression', 'scrapy.downloadermiddlewares.defaultheaders', 'scrapy.downloadermiddlewares.downloadtimeout', 'scrapy.downloadermiddlewares.httpauth', 'scrapy.downloadermiddlewares.httpcompression', 'scrapy.downloadermiddlewares.redirect', 'scrapy.downloadermiddlewares.retry', 'scrapy.downloadermiddlewares.robotstxt',
'scrapy.spidermiddlewares.depth', 'scrapy.spidermiddlewares.httperror', 'scrapy.spidermiddlewares.offsite', 'scrapy.spidermiddlewares.referer', 'scrapy.spidermiddlewares.urllength',
'scrapy.pipelines',
'scrapy.core.downloader.handlers', 'scrapy.core.downloader.contextfactory', 'scrapy.core.downloader.handlers.http', 'scrapy.core.downloader.handlers.ftp', 'scrapy.core.downloader.handlers.s3' ]
|
继续打包.
哇咔咔,终于可以运行了.
可是这个文件,只能在这个目录中运行
让我们荡起双桨~~~
经过一翻扫雷后发现是因为没有导入我们自己写的spider文件
继续~~~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| hiddenimports=[ 'huaban.pipelines', 'huaban.items', 'huaban.middlewares', 'huaban.settings', 'huaban.spiders.huabanspider',
'scrapy.spiderloader', 'urllib3', 'pymysql', 'scrapy.statscollectors', 'scrapy.logformatter', 'scrapy.dupefilters', 'scrapy.squeues',
'scrapy.extensions.spiderstate', 'scrapy.extensions.corestats', 'scrapy.extensions.telnet', 'scrapy.extensions.logstats', 'scrapy.extensions.memusage', 'scrapy.extensions.feedexport', 'scrapy.extensions.closespider', 'scrapy.extensions.debug', 'scrapy.extensions.httpcache', 'scrapy.extensions.statsmailer', 'scrapy.extensions.throttle', 'scrapy.extensions.memdebug',
'scrapy.core.scheduler', 'scrapy.core.engine', 'scrapy.core.scraper', 'scrapy.core.spidermw', 'scrapy.core.downloader', 'scrapy.downloadermiddlewares.stats', 'scrapy.downloadermiddlewares.httpcache', 'scrapy.downloadermiddlewares.cookies', 'scrapy.downloadermiddlewares.useragent', 'scrapy.downloadermiddlewares.httpproxy', 'scrapy.downloadermiddlewares.ajaxcrawl', 'scrapy.downloadermiddlewares.chunked', 'scrapy.downloadermiddlewares.decompression', 'scrapy.downloadermiddlewares.defaultheaders', 'scrapy.downloadermiddlewares.downloadtimeout', 'scrapy.downloadermiddlewares.httpauth', 'scrapy.downloadermiddlewares.httpcompression', 'scrapy.downloadermiddlewares.redirect', 'scrapy.downloadermiddlewares.retry', 'scrapy.downloadermiddlewares.robotstxt',
'scrapy.spidermiddlewares.depth', 'scrapy.spidermiddlewares.httperror', 'scrapy.spidermiddlewares.offsite', 'scrapy.spidermiddlewares.referer', 'scrapy.spidermiddlewares.urllength',
'scrapy.pipelines',
'scrapy.core.downloader.handlers', 'scrapy.core.downloader.contextfactory', 'scrapy.core.downloader.handlers.http', 'scrapy.core.downloader.handlers.ftp', 'scrapy.core.downloader.handlers.s3' ]
|
此时,等于可以了.让我们去划船吧