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'
]

此时,等于可以了.让我们去划船吧