def fetch(url, **kwargs):
    """Fetches an URL and returns the response.

    Parameters
    ----------
    url : str
        An URL to crawl.
    spider_cls : scrapy.Spider (default: DefaultSpider)
        A spider class to be used in the crawler instance.
    capture_items : bool (default: True)
        If enabled, the scraped items are captured and returned.
    return_crawler : bool (default: False)
        If enabled, the crawler instance is returned. If ``capture_items`` is
        enabled, the scraped items is collected in ``crawler.items``.
    settings : dict, optional
        Custom crawler settings.
    timeout : int, (default: DEFAULT_TIMEOUT)
        Result wait timeout.

    Returns
    -------
    out : Response or None
        Returns a ``Response`` instance if the crawler is able to retrieve a
        response, otherwise it returns ``None``.

    Raises
    ------
    crochet.TimeoutError

    """
    timeout = kwargs.pop('timeout', DEFAULT_TIMEOUT)
    kwargs['return_crawler'] = True
    crawler = wait_for(timeout, _fetch_in_reactor, url, **kwargs)
    if hasattr(crawler.spider, 'response'):
        return crawler.spider.response