写爬虫项目时,为防止某一个爬虫挂了影响到其他爬虫的进行,所以对爬虫单独开启一个进程,然后设置每个爬虫时间范围,如果超出了这个时间,则将该爬虫的进程kill
掉,这样可以不影响其他爬虫任务的进行。使用subprocess模块
```python
# scrapy crawl *** -a taskid=***
spider_name = gbl.gConfig.get('spiders_info').get('gxmobile').get(spider_type)
cmd = [env_path, 'crawl', spider_name, '-a', f'taskid={task_id}']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
cwd=f'{project_path}')
# 必须在执行周期时间之内执行完成
try:
p.wait(timeout=gbl.gConfig.get('spiders_info').get('gxmobile').get('timeout').get(spider_type))
gbl.gLogger.info(f'run spider done for {task_id}!')
return True
except Exception as e:
gbl.gLogger.error(f'async_run_spider failed {task_id}, desc: {e}->{traceback.format_exc()}')
p.kill()
return False
这里展现的是使用方法,具体的参数这里我就介绍一个这里用到的,就是cwd
参数,这个参数的意思是所需进行任务的路径,比如我这里写的scrapy
爬虫,那么我需要将路径切换为这个scrapy
项目下才可以开启爬虫。
然后就是wait()
使用,设置timeout
参数的值就可以,如果没有在规定时间内完成任务,那么就会出错。