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