docs: def user_process(self, input_data):
          """
          :param input_data:
          :return: output_data, list of next model instance. For example, if
            model is :class:`~crawl_zillow.model.State`, then next model is
            :class:`~crawl_zillow.model.County`.
          """
          url = input_data.doc.url
  
          self.logger.info("Crawl %s ." % url, 1)
  
          output_data = OutputData(data=list())
          try:
              html = get_html(
                  url,
                  wait_time=Config.Crawler.wait_time,
                  driver=self._selenium_driver,
                  **input_data.get_html_kwargs)
  
              # some this model's attributes will also available in next model
              d = input_data.doc.to_dict()
              del d[primary_key]
              del d[status_key]
              del d[edit_at_key]
              del d[n_children_key]
  
              try:
                  for href, name in htmlparser.get_items(html):
                      data = {
                          primary_key: href,
                          self.next_model_col_name: name,
                      }
                      data.update(d)
                      next_model_instance = self.next_model(**data)
                      output_data.data.append(next_model_instance)
                  self.logger.info(Status.S50_Finished.description, 1)
                  output_data.status = Status.S50_Finished.id
              except Exception as e:
                  raise exc.ParseError
          except exc.CaptchaError as e:
              time.sleep(10.0)  # Wait for 10 seconds to solve Captcha
              self.logger.info(Status.S20_WrongPage.description, 1)
              output_data.status = Status.S20_WrongPage.id
              output_data.errors = e
          except exc.WrongHtmlError as e:
              self.logger.info(Status.S20_WrongPage.description, 1)
              output_data.status = Status.S20_WrongPage.id
              output_data.errors = e
          except exc.ParseError as e:
              self.logger.info(Status.S30_ParseError.description, 1)
              output_data.status = Status.S30_ParseError.id
              output_data.errors = e
          except exc.ServerSideError as e:
              self.logger.info(Status.S60_ServerSideError.description, 1)
              output_data.status = Status.S60_ServerSideError.id
              output_data.errors = e
          except Exception as e:
              self.logger.info(Status.S10_HttpError.description, 1)
              output_data.status = Status.S10_HttpError.id
              output_data.errors = e
          # output_data.data = output_data.data[:2] # COMMENT OUT IN PROD
  
          return output_data