在Redis中,使用一个字符串来存放命令。字符串的名字叫做"scrapy_manager",它的值只有三种:start,stop 和deploy。
1.start
start这个命令的作用是创建一个子进程来运行爬虫,使用到的是Python的subprocess库。
self.START_SPIDER ='python {}'.format(os.path.join('last_release','main.py'))
self.process = subprocess.Popen(shlex.split(self.START_SPIDER))
由于在Windows下,路径中使用反斜杠作为分隔符,而在Linux和Mac OS中,使用斜杠作为分隔符,所以这里的分隔符使用Python自动生成。
shlex.split()
可以将一个字符串按照空格分成列表,因此在这里相当于:
self.START_SPIDER.split(' ')
实际上subprocess.Popen是可以使用字符串命令作为参数,但是有时候会出现莫名其妙的问题,因此建议大家像上面代码一样将命令切分为列表来使用。
2.stop
所谓的停止爬虫其实就是杀掉子进程,使用以下代码来实现:
self.process.kill()
3.deploy
自动部署功能的原理是:将修改以后的爬虫打包为zip文件,放在Master服务器上,然后向Redis写入deploy命令。程序读到这个命令以后,就使用requests将zip文件下载到本地,然后解压缩覆盖之前的程序。Python程序在运行的时候,.py文件是可以被直接修改的,但是修改并不会立刻生效,因此需要停止爬虫,然后重新运行。在我提供给大家的代码中,解压缩zip的功能是通过调用系统API来实现的。大家也可以直接使用Python自带的库来实现解压缩。
网友评论