成功解决在已经安装pywin32的情况下启动爬虫还是报错: builtins.NotImplementedError: spawnProcess not available since pywin32 is not installed.
使用scrapyd命令启动远程爬虫程序:
curl http://localhost:6800/scheduler.json-d project=myproject -d spider=myspider
执行后,显示执行成功,但是爬虫程序没有运行起来,打开scrapyd的启动窗口中,显示如下错误:
2023:06:58:22 +0000] "POST /schedule.json HTTP/1.1" 200 94 "-" "curl/7.83.1"
2023-04-06T14:58:26+0800 [twisted.internet.defer#critical] Unhandled error in De
ferred:
2023-04-06T14:58:26+0800 [twisted.internet.defer#critical]
Traceback (most recent call last):
File "c:\users\administrator\appdata\local\programs\python\python38\li
b\site-packages\scrapyd\poller.py", line 25, in poll
returnValue(self.dq.put(self._message(msg, p)))
File "c:\users\administrator\appdata\local\programs\python\python38\li
b\site-packages\twisted\internet\defer.py", line 2215, in put
self.waiting.pop(0).callback(obj)
File "c:\users\administrator\appdata\local\programs\python\python38\li
b\site-packages\twisted\internet\defer.py", line 696, in callback
self._startRunCallbacks(result)
File "c:\users\administrator\appdata\local\programs\python\python38\li
b\site-packages\twisted\internet\defer.py", line 798, in _startRunCallbacks
self._runCallbacks()
--- ---
File "c:\users\administrator\appdata\local\programs\python\python38\li
b\site-packages\twisted\internet\defer.py", line 892, in _runCallbacks
current.result = callback( # type: ignore[misc]
File "c:\users\administrator\appdata\local\programs\python\python38\li
b\site-packages\scrapyd\launcher.py", line 49, in _spawn_process
reactor.spawnProcess(pp, sys.executable, args=args, env=env)
File "c:\users\administrator\appdata\local\programs\python\python38\li
b\site-packages\twisted\internet\posixbase.py", line 223, in spawnProcess
raise NotImplementedError(
builtins.NotImplementedError: spawnProcess not available since pywin32 i
s not installed.
1、根据提示,显示pywin32没有安装,于是cmd中输入:
pip install pywin32
2、然后关闭scrapyd,重启启动
3、输入命令并执行:
curl http://localhost:6800/scheduler.json-d project=myproject -d spider=myspider
爬虫程序还是没有启动,scrapyd窗口中依然显示builtins.NotImplementedError: spawnProcess not available since pywin32 is not installed.
4、于是,再去看下错误提示怎么说的
1)错误提示在twisted包下面的一个类中的第223行抛出的这个异常,于是找到并打开这个文件。
2)定位到223行,这里是else然后抛出了这个异常,那么我们看下怎么不让它执行到else。看下前面if判断的是win32process这个变量:
3)找到win32process的定义。ctrl+F查找
找到第 65行,import导入了win32process,如果导入失败则win32process的值为None。哦,那是不是因为我的电脑上没有win32process这个包,所以就导入失败了,进而导致win32process变量的值为None了,最终导致抛出了那个异常。
4)那么,我们第一反应就是检查下没有win32process这个包:
pip show win32process
果然没有这个包。
5)既然没有,那就安装win32process :
pip install win32process
接着又出现了一个错误,没有找到对应的版本。
根据错误提示,升级下pip:
python.exe -m pip install --upgrade pip
然后继续执行pip install win32process 还是报错找不到这个包。
咦,怎么回事呢?为什么没有win32process包?回到初始的问题(当遇到问题进行不下去的时候,回到初始,这是解决问题的一个经验),一开始是提示pywin32找不到,而经过我的分析应该是win32process这个包找不到,那为什么错误不直接提示win32process找不到呢,这两个包有什么关系呢?一查,哦,原来win32process是在pywin32中的一个模块。所以我明白了,win32process在源代码中没有引入成功,说明pywin32没有安装或安装的不对呗。而我们已经安装过pywin32,所以确定最终的原因就是pywin32安装不正确。
6)卸载pywin32:
pip uninstall pywin32
7)换一个pip源安装:
pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
8)启动爬虫
curl http://localhost:6800/scheduler.json-d project=myproject -d spider=myspider
可以打开scrapyd窗口没有看到报错信息,显示正在爬取数据,而且job中有爬虫任务在执行,说明这次终于启动成功啦!!!
9)更换pip安装源之后,我们发现新安装的pywin32版本(版本305)和使用默认的安装源安装的pywin32版本(版本306)不一样,那有没有可能之前安装的不行是因为pywin32版本不行的问题呢,为了测试,我又卸载掉pywin32重新以指定版本号的形式安装:
pip install pywin32==305
然后再测试爬虫的启动,哦哦,可以!最终确定是pywin32版本的问题。
1、 卸载pywin32
pip uninstall pywin32
2、更换其他版本重新安装(原版本306,现在安装305)
pip install pywin32==305
3、运行爬虫程序:
curl http://localhost:6800/scheduler.json-d project=myproject -d spider=myspider
4、成功运行