We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Spider holiday_stationstores is broken
During the global build at 2021-08-18-14-42-26, spider **holiday_stationstores** failed with **552 features** and **10 errors**.

Here's [the log](https://data.alltheplaces.xyz/runs/2021-08-18-14-42-26/logs/holiday_stationstores.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-08-18-14-42-26/output/holiday_stationstores.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-08-18-14-42-26/output/holiday_stationstores.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/holiday_stationstores.py`
Content:
```
1 # -*- coding: utf-8 -*-
2 import scrapy
3 import json
4 import re
5 
6 from locations.items import GeojsonPointItem
7 
8 
9 class HolidayStationstoreSpider(scrapy.Spider):
10     name = "holiday_stationstores"
11     item_attributes = {'brand': 'Holiday Stationstores',
12                        'brand_wikidata': 'Q5880490'}
13     allowed_domains = ["www.holidaystationstores.com"]
14     download_delay = 0.2
15 
16     def start_requests(self):
17         yield scrapy.Request('https://www.holidaystationstores.com/Locations/GetAllStores',
18                              method='POST',
19                              callback=self.parse_all_stores)
20 
21     def parse_all_stores(self, response):
22         all_stores = json.loads(response.text)
23 
24         for store_id, store in all_stores.items():
25             # GET requests get blocked by their Incapsula bot protection, but POST works fine
26             yield scrapy.Request(f"https://www.holidaystationstores.com/Locations/Detail?storeNumber={store_id}",
27                                  method='POST',
28                                  meta={'store': store})
29 
30     def parse(self, response):
31         store = response.meta['store']
32 
33         address = response.xpath('//div[@class="col-lg-4 col-sm-12"]/text()')[1].extract().strip()
34         phone = response.xpath('//div[@class="HolidayFontColorRed"]/text()').extract_first().strip()
35         services = '|'.join(response.xpath('//ul[@style="list-style-type: none; padding-left: 1.0em; font-size: 12px;"]/li/text()').extract()).lower()
36         open_24_hours = '24 hours' in response.css(
37             '.body-content .col-lg-4').get().lower()
38 
39         properties = {
40             'name': f"Holiday #{store['Name']}",
41             'lon': store['Lng'],
42             'lat': store['Lat'],
43             'addr_full': address,
44             'phone': phone,
45             'ref': store['ID'],
46             'opening_hours': '24/7' if open_24_hours else self.opening_hours(response),
47             'extras': {
48                 'amenity:fuel': True,
49                 'fuel:diesel': 'diesel' in services or None,
50                 'atm': 'atm' in services or None,
51                 'fuel:e85': 'e85' in services or None,
52                 'hgv': 'truck' in services or None,
53                 'fuel:propane': 'propane' in services or None,
54                 'car_wash': 'car wash' in services or None,
55                 'fuel:cng': 'cng' in services or None
56             }
57         }
58 
59         yield GeojsonPointItem(**properties)
60 
61     def opening_hours(self, response):
62         hour_part_elems = response.xpath('//div[@class="row"][@style="font-size: 12px;"]')
63         day_groups = []
64         this_day_group = None
65 
66         if hour_part_elems:
67             for hour_part_elem in hour_part_elems:
68                 day = hour_part_elem.xpath('.//div[@class="col-3"]/text()').extract_first()
69                 hours = hour_part_elem.xpath('.//div[@class="col-9"]/text()').extract_first()
70 
71                 if not hours:
72                     continue
73 
74                 day = day[:2]
75                 match = re.search(
76                     r'^(\d{1,2}):(\d{2})\s*(a|p)m - (\d{1,2}):(\d{2})\s*(a|p)m?$', hours.lower())
77                 (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()
78 
79                 f_hr = int(f_hr)
80                 if f_ampm == 'p':
81                     f_hr += 12
82                 elif f_ampm == 'a' and f_hr == 12:
83                     f_hr = 0
84                 t_hr = int(t_hr)
85                 if t_ampm == 'p':
86                     t_hr += 12
87                 elif t_ampm == 'a' and t_hr == 12:
88                     t_hr = 0
89 
90                 hours = '{:02d}:{}-{:02d}:{}'.format(
91                     f_hr,
92                     f_min,
93                     t_hr,
94                     t_min,
95                 )
96 
97                 if not this_day_group:
98                     this_day_group = {
99                         'from_day': day,
100                         'to_day': day,
101                         'hours': hours
102                     }
103                 elif this_day_group['hours'] != hours:
104                     day_groups.append(this_day_group)
105                     this_day_group = {
106                         'from_day': day,
107                         'to_day': day,
108                         'hours': hours
109                     }
110                 elif this_day_group['hours'] == hours:
111                     this_day_group['to_day'] = day
112 
113             if this_day_group:
114                 day_groups.append(this_day_group)
115 
116         hour_part_elems = response.xpath('//span[@style="font-size:90%"]/text()').extract()
117         if hour_part_elems:
118             day_groups.append({'from_day': 'Mo', 'to_day': 'Su', 'hours': '00:00-23:59'})
119 
120         opening_hours = ""
121         if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):
122             opening_hours = '24/7'
123         else:
124             for day_group in day_groups:
125                 if day_group['from_day'] == day_group['to_day']:
126                     opening_hours += '{from_day} {hours}; '.format(**day_group)
127                 elif day_group['from_day'] == 'Su' and day_group['to_day'] == 'Sa':
128                     opening_hours += '{hours}; '.format(**day_group)
129                 else:
130                     opening_hours += '{from_day}-{to_day} {hours}; '.format(
131                         **day_group)
132             opening_hours = opening_hours[:-2]
133 
134         return opening_hours
135
```
--- 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/holiday_stationstores.py b/locations/spiders/holiday_stationstores.py
--- a/locations/spiders/holiday_stationstores.py
+++ b/locations/spiders/holiday_stationstores.py
@@ -31,6 +31,8 @@
         store = response.meta['store']
 
         address = response.xpath('//div[@class="col-lg-4 col-sm-12"]/text()')[1].extract().strip()
+        city_state = response.xpath('//div[@class="col-lg-4 col-sm-12"]/text()')[2].extract().strip()
+        city, state = city_state.split(", ")
         phone = response.xpath('//div[@class="HolidayFontColorRed"]/text()').extract_first().strip()
         services = '|'.join(response.xpath('//ul[@style="list-style-type: none; padding-left: 1.0em; font-size: 12px;"]/li/text()').extract()).lower()
         open_24_hours = '24 hours' in response.css(
@@ -43,6 +45,9 @@
             'addr_full': address,
             'phone': phone,
             'ref': store['ID'],
+            'city': city.strip(),
+            'state': state.strip(),
+            'website': response.url,
             'opening_hours': '24/7' if open_24_hours else self.opening_hours(response),
             'extras': {
                 'amenity:fuel': True,
@@ -68,7 +73,7 @@
                 day = hour_part_elem.xpath('.//div[@class="col-3"]/text()').extract_first()
                 hours = hour_part_elem.xpath('.//div[@class="col-9"]/text()').extract_first()
 
-                if not hours:
+                if not hours or hours.lower() == 'closed':
                     continue
 
                 day = day[:2]

{"golden_diff": "diff --git a/locations/spiders/holiday_stationstores.py b/locations/spiders/holiday_stationstores.py\n--- a/locations/spiders/holiday_stationstores.py\n+++ b/locations/spiders/holiday_stationstores.py\n@@ -31,6 +31,8 @@\n         store = response.meta['store']\n \n         address = response.xpath('//div[@class=\"col-lg-4 col-sm-12\"]/text()')[1].extract().strip()\n+        city_state = response.xpath('//div[@class=\"col-lg-4 col-sm-12\"]/text()')[2].extract().strip()\n+        city, state = city_state.split(\", \")\n         phone = response.xpath('//div[@class=\"HolidayFontColorRed\"]/text()').extract_first().strip()\n         services = '|'.join(response.xpath('//ul[@style=\"list-style-type: none; padding-left: 1.0em; font-size: 12px;\"]/li/text()').extract()).lower()\n         open_24_hours = '24 hours' in response.css(\n@@ -43,6 +45,9 @@\n             'addr_full': address,\n             'phone': phone,\n             'ref': store['ID'],\n+            'city': city.strip(),\n+            'state': state.strip(),\n+            'website': response.url,\n             'opening_hours': '24/7' if open_24_hours else self.opening_hours(response),\n             'extras': {\n                 'amenity:fuel': True,\n@@ -68,7 +73,7 @@\n                 day = hour_part_elem.xpath('.//div[@class=\"col-3\"]/text()').extract_first()\n                 hours = hour_part_elem.xpath('.//div[@class=\"col-9\"]/text()').extract_first()\n \n-                if not hours:\n+                if not hours or hours.lower() == 'closed':\n                     continue\n \n                 day = day[:2]\n", "issue": "Spider holiday_stationstores is broken\nDuring the global build at 2021-08-18-14-42-26, spider **holiday_stationstores** failed with **552 features** and **10 errors**.\n\nHere's [the log](https://data.alltheplaces.xyz/runs/2021-08-18-14-42-26/logs/holiday_stationstores.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-08-18-14-42-26/output/holiday_stationstores.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-08-18-14-42-26/output/holiday_stationstores.geojson))\n", "before_files": [{"content": "# -*- coding: utf-8 -*-\nimport scrapy\nimport json\nimport re\n\nfrom locations.items import GeojsonPointItem\n\n\nclass HolidayStationstoreSpider(scrapy.Spider):\n    name = \"holiday_stationstores\"\n    item_attributes = {'brand': 'Holiday Stationstores',\n                       'brand_wikidata': 'Q5880490'}\n    allowed_domains = [\"www.holidaystationstores.com\"]\n    download_delay = 0.2\n\n    def start_requests(self):\n        yield scrapy.Request('https://www.holidaystationstores.com/Locations/GetAllStores',\n                             method='POST',\n                             callback=self.parse_all_stores)\n\n    def parse_all_stores(self, response):\n        all_stores = json.loads(response.text)\n\n        for store_id, store in all_stores.items():\n            # GET requests get blocked by their Incapsula bot protection, but POST works fine\n            yield scrapy.Request(f\"https://www.holidaystationstores.com/Locations/Detail?storeNumber={store_id}\",\n                                 method='POST',\n                                 meta={'store': store})\n\n    def parse(self, response):\n        store = response.meta['store']\n\n        address = response.xpath('//div[@class=\"col-lg-4 col-sm-12\"]/text()')[1].extract().strip()\n        phone = response.xpath('//div[@class=\"HolidayFontColorRed\"]/text()').extract_first().strip()\n        services = '|'.join(response.xpath('//ul[@style=\"list-style-type: none; padding-left: 1.0em; font-size: 12px;\"]/li/text()').extract()).lower()\n        open_24_hours = '24 hours' in response.css(\n            '.body-content .col-lg-4').get().lower()\n\n        properties = {\n            'name': f\"Holiday #{store['Name']}\",\n            'lon': store['Lng'],\n            'lat': store['Lat'],\n            'addr_full': address,\n            'phone': phone,\n            'ref': store['ID'],\n            'opening_hours': '24/7' if open_24_hours else self.opening_hours(response),\n            'extras': {\n                'amenity:fuel': True,\n                'fuel:diesel': 'diesel' in services or None,\n                'atm': 'atm' in services or None,\n                'fuel:e85': 'e85' in services or None,\n                'hgv': 'truck' in services or None,\n                'fuel:propane': 'propane' in services or None,\n                'car_wash': 'car wash' in services or None,\n                'fuel:cng': 'cng' in services or None\n            }\n        }\n\n        yield GeojsonPointItem(**properties)\n\n    def opening_hours(self, response):\n        hour_part_elems = response.xpath('//div[@class=\"row\"][@style=\"font-size: 12px;\"]')\n        day_groups = []\n        this_day_group = None\n\n        if hour_part_elems:\n            for hour_part_elem in hour_part_elems:\n                day = hour_part_elem.xpath('.//div[@class=\"col-3\"]/text()').extract_first()\n                hours = hour_part_elem.xpath('.//div[@class=\"col-9\"]/text()').extract_first()\n\n                if not hours:\n                    continue\n\n                day = day[:2]\n                match = re.search(\n                    r'^(\\d{1,2}):(\\d{2})\\s*(a|p)m - (\\d{1,2}):(\\d{2})\\s*(a|p)m?$', hours.lower())\n                (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()\n\n                f_hr = int(f_hr)\n                if f_ampm == 'p':\n                    f_hr += 12\n                elif f_ampm == 'a' and f_hr == 12:\n                    f_hr = 0\n                t_hr = int(t_hr)\n                if t_ampm == 'p':\n                    t_hr += 12\n                elif t_ampm == 'a' and t_hr == 12:\n                    t_hr = 0\n\n                hours = '{:02d}:{}-{:02d}:{}'.format(\n                    f_hr,\n                    f_min,\n                    t_hr,\n                    t_min,\n                )\n\n                if not this_day_group:\n                    this_day_group = {\n                        'from_day': day,\n                        'to_day': day,\n                        'hours': hours\n                    }\n                elif this_day_group['hours'] != hours:\n                    day_groups.append(this_day_group)\n                    this_day_group = {\n                        'from_day': day,\n                        'to_day': day,\n                        'hours': hours\n                    }\n                elif this_day_group['hours'] == hours:\n                    this_day_group['to_day'] = day\n\n            if this_day_group:\n                day_groups.append(this_day_group)\n\n        hour_part_elems = response.xpath('//span[@style=\"font-size:90%\"]/text()').extract()\n        if hour_part_elems:\n            day_groups.append({'from_day': 'Mo', 'to_day': 'Su', 'hours': '00:00-23:59'})\n\n        opening_hours = \"\"\n        if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):\n            opening_hours = '24/7'\n        else:\n            for day_group in day_groups:\n                if day_group['from_day'] == day_group['to_day']:\n                    opening_hours += '{from_day} {hours}; '.format(**day_group)\n                elif day_group['from_day'] == 'Su' and day_group['to_day'] == 'Sa':\n                    opening_hours += '{hours}; '.format(**day_group)\n                else:\n                    opening_hours += '{from_day}-{to_day} {hours}; '.format(\n                        **day_group)\n            opening_hours = opening_hours[:-2]\n\n        return opening_hours\n", "path": "locations/spiders/holiday_stationstores.py"}], "after_files": [{"content": "# -*- coding: utf-8 -*-\nimport scrapy\nimport json\nimport re\n\nfrom locations.items import GeojsonPointItem\n\n\nclass HolidayStationstoreSpider(scrapy.Spider):\n    name = \"holiday_stationstores\"\n    item_attributes = {'brand': 'Holiday Stationstores',\n                       'brand_wikidata': 'Q5880490'}\n    allowed_domains = [\"www.holidaystationstores.com\"]\n    download_delay = 0.2\n\n    def start_requests(self):\n        yield scrapy.Request('https://www.holidaystationstores.com/Locations/GetAllStores',\n                             method='POST',\n                             callback=self.parse_all_stores)\n\n    def parse_all_stores(self, response):\n        all_stores = json.loads(response.text)\n\n        for store_id, store in all_stores.items():\n            # GET requests get blocked by their Incapsula bot protection, but POST works fine\n            yield scrapy.Request(f\"https://www.holidaystationstores.com/Locations/Detail?storeNumber={store_id}\",\n                                 method='POST',\n                                 meta={'store': store})\n\n    def parse(self, response):\n        store = response.meta['store']\n\n        address = response.xpath('//div[@class=\"col-lg-4 col-sm-12\"]/text()')[1].extract().strip()\n        city_state = response.xpath('//div[@class=\"col-lg-4 col-sm-12\"]/text()')[2].extract().strip()\n        city, state = city_state.split(\", \")\n        phone = response.xpath('//div[@class=\"HolidayFontColorRed\"]/text()').extract_first().strip()\n        services = '|'.join(response.xpath('//ul[@style=\"list-style-type: none; padding-left: 1.0em; font-size: 12px;\"]/li/text()').extract()).lower()\n        open_24_hours = '24 hours' in response.css(\n            '.body-content .col-lg-4').get().lower()\n\n        properties = {\n            'name': f\"Holiday #{store['Name']}\",\n            'lon': store['Lng'],\n            'lat': store['Lat'],\n            'addr_full': address,\n            'phone': phone,\n            'ref': store['ID'],\n            'city': city.strip(),\n            'state': state.strip(),\n            'website': response.url,\n            'opening_hours': '24/7' if open_24_hours else self.opening_hours(response),\n            'extras': {\n                'amenity:fuel': True,\n                'fuel:diesel': 'diesel' in services or None,\n                'atm': 'atm' in services or None,\n                'fuel:e85': 'e85' in services or None,\n                'hgv': 'truck' in services or None,\n                'fuel:propane': 'propane' in services or None,\n                'car_wash': 'car wash' in services or None,\n                'fuel:cng': 'cng' in services or None\n            }\n        }\n\n        yield GeojsonPointItem(**properties)\n\n    def opening_hours(self, response):\n        hour_part_elems = response.xpath('//div[@class=\"row\"][@style=\"font-size: 12px;\"]')\n        day_groups = []\n        this_day_group = None\n\n        if hour_part_elems:\n            for hour_part_elem in hour_part_elems:\n                day = hour_part_elem.xpath('.//div[@class=\"col-3\"]/text()').extract_first()\n                hours = hour_part_elem.xpath('.//div[@class=\"col-9\"]/text()').extract_first()\n\n                if not hours or hours.lower() == 'closed':\n                    continue\n\n                day = day[:2]\n                match = re.search(\n                    r'^(\\d{1,2}):(\\d{2})\\s*(a|p)m - (\\d{1,2}):(\\d{2})\\s*(a|p)m?$', hours.lower())\n                (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()\n\n                f_hr = int(f_hr)\n                if f_ampm == 'p':\n                    f_hr += 12\n                elif f_ampm == 'a' and f_hr == 12:\n                    f_hr = 0\n                t_hr = int(t_hr)\n                if t_ampm == 'p':\n                    t_hr += 12\n                elif t_ampm == 'a' and t_hr == 12:\n                    t_hr = 0\n\n                hours = '{:02d}:{}-{:02d}:{}'.format(\n                    f_hr,\n                    f_min,\n                    t_hr,\n                    t_min,\n                )\n\n                if not this_day_group:\n                    this_day_group = {\n                        'from_day': day,\n                        'to_day': day,\n                        'hours': hours\n                    }\n                elif this_day_group['hours'] != hours:\n                    day_groups.append(this_day_group)\n                    this_day_group = {\n                        'from_day': day,\n                        'to_day': day,\n                        'hours': hours\n                    }\n                elif this_day_group['hours'] == hours:\n                    this_day_group['to_day'] = day\n\n            if this_day_group:\n                day_groups.append(this_day_group)\n\n        hour_part_elems = response.xpath('//span[@style=\"font-size:90%\"]/text()').extract()\n        if hour_part_elems:\n            day_groups.append({'from_day': 'Mo', 'to_day': 'Su', 'hours': '00:00-23:59'})\n\n        opening_hours = \"\"\n        if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):\n            opening_hours = '24/7'\n        else:\n            for day_group in day_groups:\n                if day_group['from_day'] == day_group['to_day']:\n                    opening_hours += '{from_day} {hours}; '.format(**day_group)\n                elif day_group['from_day'] == 'Su' and day_group['to_day'] == 'Sa':\n                    opening_hours += '{hours}; '.format(**day_group)\n                else:\n                    opening_hours += '{from_day}-{to_day} {hours}; '.format(\n                        **day_group)\n            opening_hours = opening_hours[:-2]\n\n        return opening_hours\n", "path": "locations/spiders/holiday_stationstores.py"}]}