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()

```

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(),

{"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"}]}