目录
pyinstaller安装和基本使用
安装
pip install pyinstaller
常用打包命令
完全打包
pyinstaller run.py # 需要打包的文件名
打包单文件
pyinstaller -F run.py
# 或者是
pyinstaller -onefile run.py
生成两个文件夹:bulid、dist,和一个配置文件run.spec
scrapy的准备工作
一般运行scrapy使用命令行进行操作,在此处要写一个入口文件,我这里是与scrapy.cfg文件平级,写了一个run.py文件
文件内容如下:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
# from taobaoProject.spiders.taobaolist import TaobaoListSpider
import os
os.chdir('./dmeo/spiders')
# 如果你的demo01文件中有读取文文件的操作,需要更改当前运行环境,我这里是需要在spiders同级的文件夹ck中读取数据
process = CrawlerProcess(get_project_settings())
process.crawl('demo01') # 填入你需要运行的文件名
# 如果你的爬虫文件需要传参 则在后面以key='value'的形式正常传参即可
# ex. process.crawl('demo01',name='tom',age='age')
process.start()
用cmdline的写法会运行不起来。
from scrapy import cmdline
cmdline.execute('scrapy crawl demo01'.split())
当前的文件结构
ck 是我需要读取的文件夹,run是运行入口,之后对run进行打包。
正式打包
cd到需要打包的根目录下,进行pyinstaller操作
pyinstaller run.py
可运行的exe在新生成的dist\run
中
建议在cmd中运行exe,便于查看异常信息。
每次更改配置时,记得将执行exe的cmd窗口关闭,避免更新异常
运行后可能出现的问题(仅针对我目前遇到的)
1. 运行时出现 ‘打开此ms-gaminggoverlay链接’
其实这个窗口并不影响程序的正常运行,但是看着也很烦心就是了。
解决方法
关闭的方式也很简单,在Windows设置中查找‘Xbox Game Bar’将控制按钮关闭就好了。
2. lxml库的问题
ImportError: cannot import name _elementpath [3052] Failed to execute script 'crawl' due to unhandled exception!
lxml 库在打包后的可执行文件中出现了问题
解决方法
在run.spec中改写配置hiddenimports=['lxml._elementpath']
然后再在执行打包路径的那里执行pyinstaller run.spec
或者在第一次打包是使用如下命令
pyinstaller --hidden-import=lxml._elementpath run.py
3. 请求问题
TypeError: 'NoneType' object is not iterable
没有向parse传入请求。
之前为了测试,将start_requests中的yield scrapy.Request()注释掉了,从而发生的异常。
解决方法
做有效请求
4. 关于找不到路径的问题
前面说了,我的demo01.py调用了与spiders同级的文件夹ck做读取,所以我在run.py中更新了运行路径./dmeo/spiders。
但是在实际打包的dist文件夹中是没有这个路径的,也没有ck这个文件夹,所以直接运行时会报错
解决方法
解决方法也很简单,只需要在exe的同级目录中创建dmeo/spiders和dmeo/ck文件就可以了。
读取文件得到具体路径根据实际代码进行修改。
5. 证书问题
OSError: Could not find a suitable TLS CA certificate bundle, invalid path:
在使用 Scrapy 进行爬取时出现了 TLS CA 证书的问题。错误信息显示了无法找到合适的 TLS CA 证书文件,导致了无法进行 HTTPS 请求
解决方法
将证书文件夹复制到exe同级文件夹中
查找证书路径
import certifi
print(certifi.where())
跳转到certifi所在文件夹,将certifi整个文件夹复制到exe同级文件夹内。
6. ImportError 父包导入问题
ImportError: attempted relative import with no known parent package
触发则个异常的原因是因为我在run.py中做了相对导入,即:
from .dmeo.spiders.demo01 import Demo02Spider
导致程序无法确认导入包的明确位置
解决方法:
将相对路径改为绝对路径,从最大根目录开始跟。
from dmeo.dmeo.spiders.demo01 import Demo02Spider