code: def phantomjs(ctx, phantomjs_path, port, auto_restart, args):
      
      args = args or ctx.default_map and ctx.default_map.get('args', [])
  
      import subprocess
      g = ctx.obj
      _quit = []
      phantomjs_fetcher = os.path.join(
          os.path.dirname(pyspider.__file__), 'fetcher/phantomjs_fetcher.js')
      cmd = [phantomjs_path,
             # this may cause memory leak: https://github.com/ariya/phantomjs/issues/12903
             #'--load-images=false',
             '--ssl-protocol=any',
             '--disk-cache=true'] + list(args or []) + [phantomjs_fetcher, str(port)]
  
      try:
          _phantomjs = subprocess.Popen(cmd)
      except OSError:
          logging.warning('phantomjs not found, continue running without it.')
          return None
  
      def quit(*args, **kwargs):
          _quit.append(1)
          _phantomjs.kill()
          _phantomjs.wait()
          logging.info('phantomjs exited.')
  
      if not g.get('phantomjs_proxy'):
          g['phantomjs_proxy'] = '127.0.0.1:%s' % port
  
      phantomjs = utils.ObjectDict(port=port, quit=quit)
      g.instances.append(phantomjs)
      if g.get('testing_mode'):
          return phantomjs
  
      while True:
          _phantomjs.wait()
          if _quit or not auto_restart:
              break
          _phantomjs = subprocess.Popen(cmd)
docs: Run phantomjs fetcher if phantomjs is installed.