prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Spider academy is broken
  During the global build at 2021-05-21-20-28-08, spider **academy** failed with **0 features** and **0 errors**.
  
  Here's [the log](https://data.alltheplaces.xyz/runs/2021-05-21-20-28-08/logs/academy.log) and [the output](https://data.alltheplaces.xyz/runs/2021-05-21-20-28-08/output/academy.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-05-21-20-28-08/output/academy.geojson))
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `locations/spiders/academy.py`
  Content:
  ```
  1 # -*- coding: utf-8 -*-
  2 import json
  3 import re
  4 
  5 import scrapy
  6 from scrapy.utils.gz import gunzip
  7 
  8 from locations.items import GeojsonPointItem
  9 from locations.hours import OpeningHours
  10 
  11 
  12 class AcademySpider(scrapy.Spider):
  13     name = "academy"
  14     item_attributes = {'brand': 'Academy Sports + Outdoors', 'brand_wikidata': 'Q4671380'}
  15     allowed_domains = []
  16     start_urls = [
  17         'https://www.academy.com/sitemap_store_1.xml.gz',
  18     ]
  19 
  20     def parse(self, response):
  21         body = gunzip(response.body)
  22         body = scrapy.Selector(text=body)
  23         body.remove_namespaces()
  24         urls = body.xpath('//url/loc/text()').extract()
  25         for path in urls:
  26             store_url = re.compile(r'http://www.academy.com/shop/storelocator/.+?/.+?/store-\d+')
  27             if re.search(store_url, path):
  28                 yield scrapy.Request(
  29                     path.strip(),
  30                     callback=self.parse_store
  31                 )
  32 
  33     def parse_hours(self, hours):
  34         opening_hours = OpeningHours()
  35 
  36         for elem in hours:
  37             day, open_time, close_time = re.search(r'([A-Za-z]+)\s([\d:]+)\s-\s([\d:]+)', elem).groups()
  38             opening_hours.add_range(day=day[:2], open_time=open_time, close_time=close_time)
  39 
  40         return opening_hours.as_opening_hours()
  41 
  42     def parse_store(self, response):
  43         properties = {
  44             'ref': re.search(r'.+/(.+?)/?(?:\.html|$)', response.url).group(1),
  45             'name': response.xpath('normalize-space(//h1[@itemprop="name"]//text())').extract_first(),
  46             'addr_full': response.xpath('normalize-space(//span[@itemprop="streetAddress"]//text())').extract_first(),
  47             'city': response.xpath('normalize-space(//span[@itemprop="addressLocality"]//text())').extract_first(),
  48             'state': response.xpath('normalize-space(//span[@itemprop="addressRegion"]//text())').extract_first(),
  49             'postcode': response.xpath('normalize-space(//span[@itemprop="postalCode"]//text())').extract_first(),
  50             'phone': response.xpath('//a[@id="storePhone"]/text()').extract_first(),
  51             'website': response.url,
  52             'lat': float(response.xpath('//input[@id="params"]/@data-lat').extract_first()),
  53             'lon': float(response.xpath('//input[@id="params"]/@data-lng').extract_first()),
  54         }
  55         
  56         properties['opening_hours'] = self.parse_hours(
  57             response.xpath('//*[@itemprop="openingHours"]/@datetime').extract()
  58         )
  59         
  60         yield GeojsonPointItem(**properties)
  61
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/locations/spiders/academy.py b/locations/spiders/academy.py
  --- a/locations/spiders/academy.py
  +++ b/locations/spiders/academy.py
  @@ -23,7 +23,7 @@
           body.remove_namespaces()
           urls = body.xpath('//url/loc/text()').extract()
           for path in urls:
  -            store_url = re.compile(r'http://www.academy.com/shop/storelocator/.+?/.+?/store-\d+')
  +            store_url = re.compile(r'https://www.academy.com/shop/storelocator/.+?/.+?/store-\d+')
               if re.search(store_url, path):
                   yield scrapy.Request(
                       path.strip(),
  
verification_info: {"golden_diff": "diff --git a/locations/spiders/academy.py b/locations/spiders/academy.py\n--- a/locations/spiders/academy.py\n+++ b/locations/spiders/academy.py\n@@ -23,7 +23,7 @@\n         body.remove_namespaces()\n         urls = body.xpath('//url/loc/text()').extract()\n         for path in urls:\n-            store_url = re.compile(r'http://www.academy.com/shop/storelocator/.+?/.+?/store-\\d+')\n+            store_url = re.compile(r'https://www.academy.com/shop/storelocator/.+?/.+?/store-\\d+')\n             if re.search(store_url, path):\n                 yield scrapy.Request(\n                     path.strip(),\n", "issue": "Spider academy is broken\nDuring the global build at 2021-05-21-20-28-08, spider **academy** failed with **0 features** and **0 errors**.\n\nHere's [the log](https://data.alltheplaces.xyz/runs/2021-05-21-20-28-08/logs/academy.log) and [the output](https://data.alltheplaces.xyz/runs/2021-05-21-20-28-08/output/academy.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-05-21-20-28-08/output/academy.geojson))\n", "before_files": [{"content": "# -*- coding: utf-8 -*-\nimport json\nimport re\n\nimport scrapy\nfrom scrapy.utils.gz import gunzip\n\nfrom locations.items import GeojsonPointItem\nfrom locations.hours import OpeningHours\n\n\nclass AcademySpider(scrapy.Spider):\n    name = \"academy\"\n    item_attributes = {'brand': 'Academy Sports + Outdoors', 'brand_wikidata': 'Q4671380'}\n    allowed_domains = []\n    start_urls = [\n        'https://www.academy.com/sitemap_store_1.xml.gz',\n    ]\n\n    def parse(self, response):\n        body = gunzip(response.body)\n        body = scrapy.Selector(text=body)\n        body.remove_namespaces()\n        urls = body.xpath('//url/loc/text()').extract()\n        for path in urls:\n            store_url = re.compile(r'http://www.academy.com/shop/storelocator/.+?/.+?/store-\\d+')\n            if re.search(store_url, path):\n                yield scrapy.Request(\n                    path.strip(),\n                    callback=self.parse_store\n                )\n\n    def parse_hours(self, hours):\n        opening_hours = OpeningHours()\n\n        for elem in hours:\n            day, open_time, close_time = re.search(r'([A-Za-z]+)\\s([\\d:]+)\\s-\\s([\\d:]+)', elem).groups()\n            opening_hours.add_range(day=day[:2], open_time=open_time, close_time=close_time)\n\n        return opening_hours.as_opening_hours()\n\n    def parse_store(self, response):\n        properties = {\n            'ref': re.search(r'.+/(.+?)/?(?:\\.html|$)', response.url).group(1),\n            'name': response.xpath('normalize-space(//h1[@itemprop=\"name\"]//text())').extract_first(),\n            'addr_full': response.xpath('normalize-space(//span[@itemprop=\"streetAddress\"]//text())').extract_first(),\n            'city': response.xpath('normalize-space(//span[@itemprop=\"addressLocality\"]//text())').extract_first(),\n            'state': response.xpath('normalize-space(//span[@itemprop=\"addressRegion\"]//text())').extract_first(),\n            'postcode': response.xpath('normalize-space(//span[@itemprop=\"postalCode\"]//text())').extract_first(),\n            'phone': response.xpath('//a[@id=\"storePhone\"]/text()').extract_first(),\n            'website': response.url,\n            'lat': float(response.xpath('//input[@id=\"params\"]/@data-lat').extract_first()),\n            'lon': float(response.xpath('//input[@id=\"params\"]/@data-lng').extract_first()),\n        }\n        \n        properties['opening_hours'] = self.parse_hours(\n            response.xpath('//*[@itemprop=\"openingHours\"]/@datetime').extract()\n        )\n        \n        yield GeojsonPointItem(**properties)\n", "path": "locations/spiders/academy.py"}], "after_files": [{"content": "# -*- coding: utf-8 -*-\nimport json\nimport re\n\nimport scrapy\nfrom scrapy.utils.gz import gunzip\n\nfrom locations.items import GeojsonPointItem\nfrom locations.hours import OpeningHours\n\n\nclass AcademySpider(scrapy.Spider):\n    name = \"academy\"\n    item_attributes = {'brand': 'Academy Sports + Outdoors', 'brand_wikidata': 'Q4671380'}\n    allowed_domains = []\n    start_urls = [\n        'https://www.academy.com/sitemap_store_1.xml.gz',\n    ]\n\n    def parse(self, response):\n        body = gunzip(response.body)\n        body = scrapy.Selector(text=body)\n        body.remove_namespaces()\n        urls = body.xpath('//url/loc/text()').extract()\n        for path in urls:\n            store_url = re.compile(r'https://www.academy.com/shop/storelocator/.+?/.+?/store-\\d+')\n            if re.search(store_url, path):\n                yield scrapy.Request(\n                    path.strip(),\n                    callback=self.parse_store\n                )\n\n    def parse_hours(self, hours):\n        opening_hours = OpeningHours()\n\n        for elem in hours:\n            day, open_time, close_time = re.search(r'([A-Za-z]+)\\s([\\d:]+)\\s-\\s([\\d:]+)', elem).groups()\n            opening_hours.add_range(day=day[:2], open_time=open_time, close_time=close_time)\n\n        return opening_hours.as_opening_hours()\n\n    def parse_store(self, response):\n        properties = {\n            'ref': re.search(r'.+/(.+?)/?(?:\\.html|$)', response.url).group(1),\n            'name': response.xpath('normalize-space(//h1[@itemprop=\"name\"]//text())').extract_first(),\n            'addr_full': response.xpath('normalize-space(//span[@itemprop=\"streetAddress\"]//text())').extract_first(),\n            'city': response.xpath('normalize-space(//span[@itemprop=\"addressLocality\"]//text())').extract_first(),\n            'state': response.xpath('normalize-space(//span[@itemprop=\"addressRegion\"]//text())').extract_first(),\n            'postcode': response.xpath('normalize-space(//span[@itemprop=\"postalCode\"]//text())').extract_first(),\n            'phone': response.xpath('//a[@id=\"storePhone\"]/text()').extract_first(),\n            'website': response.url,\n            'lat': float(response.xpath('//input[@id=\"params\"]/@data-lat').extract_first()),\n            'lon': float(response.xpath('//input[@id=\"params\"]/@data-lng').extract_first()),\n        }\n        \n        properties['opening_hours'] = self.parse_hours(\n            response.xpath('//*[@itemprop=\"openingHours\"]/@datetime').extract()\n        )\n        \n        yield GeojsonPointItem(**properties)\n", "path": "locations/spiders/academy.py"}]}