We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Spider public_storage is broken
During the global build at 2021-08-04-14-42-45, spider **public_storage** failed with **834 features** and **1879 errors**.

Here's [the log](https://data.alltheplaces.xyz/runs/2021-08-04-14-42-45/logs/public_storage.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-08-04-14-42-45/output/public_storage.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-08-04-14-42-45/output/public_storage.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/public_storage.py`
Content:
```
1 # -*- coding: utf-8 -*-
2 import scrapy
3 import json
4 
5 from locations.items import GeojsonPointItem
6 from locations.hours import OpeningHours
7 
8 
9 class PublicStorageSpider(scrapy.Spider):
10     name = "public_storage"
11     item_attributes = { 'brand': "Public Storage" }
12     allowed_domains = ["www.publicstorage.com"]
13     start_urls = (
14         'https://www.publicstorage.com/sitemap_plp.xml',
15     )
16 
17     def parse(self, response):
18         response.selector.remove_namespaces()
19         city_urls = response.xpath('//url/loc/text()').extract()
20         for path in city_urls:
21             yield scrapy.Request(
22                 path.strip(),
23                 callback=self.parse_store,
24             )
25 
26     def parse_hours(self, hours):
27         opening_hours = OpeningHours()
28 
29         for hour in hours:
30             for day in hour['dayOfWeek']:
31                 opening_hours.add_range(
32                     day=day[:2],
33                     open_time=hour["opens"],
34                     close_time=hour["closes"],
35                 )
36 
37         return opening_hours.as_opening_hours()
38 
39     def parse_store(self, response):
40         data = json.loads(response.xpath('//script[@type="application/ld+json"]/text()').extract_first())
41         data = data['@graph'][0]
42 
43         properties = {
44             "ref": data['@id'],
45             "opening_hours": self.parse_hours(data['openingHoursSpecification']),
46             "addr_full": data['address']['streetAddress'],
47             "city": data['address']['addressLocality'],
48             "state": data['address']['addressRegion'],
49             "postcode": data['address']['postalCode'],
50             "phone": data['telephone'],
51             "lat": data['geo']['latitude'],
52             "lon": data['geo']['longitude'],
53         }
54 
55         yield GeojsonPointItem(**properties)
56
```
--- 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/public_storage.py b/locations/spiders/public_storage.py
--- a/locations/spiders/public_storage.py
+++ b/locations/spiders/public_storage.py
@@ -20,9 +20,13 @@
         for path in city_urls:
             yield scrapy.Request(
                 path.strip(),
-                callback=self.parse_store,
+                callback=self.load_store,
             )
 
+    def load_store(self, response):
+        ldjson = response.xpath('//link[@type="application/ld+json"]/@href').get()
+        yield scrapy.Request(response.urljoin(ldjson), callback=self.parse_store)
+
     def parse_hours(self, hours):
         opening_hours = OpeningHours()
 
@@ -37,11 +41,11 @@
         return opening_hours.as_opening_hours()
 
     def parse_store(self, response):
-        data = json.loads(response.xpath('//script[@type="application/ld+json"]/text()').extract_first())
-        data = data['@graph'][0]
+        data = response.json()['@graph'][0]
 
         properties = {
             "ref": data['@id'],
+            "website": data['url'],
             "opening_hours": self.parse_hours(data['openingHoursSpecification']),
             "addr_full": data['address']['streetAddress'],
             "city": data['address']['addressLocality'],

{"golden_diff": "diff --git a/locations/spiders/public_storage.py b/locations/spiders/public_storage.py\n--- a/locations/spiders/public_storage.py\n+++ b/locations/spiders/public_storage.py\n@@ -20,9 +20,13 @@\n         for path in city_urls:\n             yield scrapy.Request(\n                 path.strip(),\n-                callback=self.parse_store,\n+                callback=self.load_store,\n             )\n \n+    def load_store(self, response):\n+        ldjson = response.xpath('//link[@type=\"application/ld+json\"]/@href').get()\n+        yield scrapy.Request(response.urljoin(ldjson), callback=self.parse_store)\n+\n     def parse_hours(self, hours):\n         opening_hours = OpeningHours()\n \n@@ -37,11 +41,11 @@\n         return opening_hours.as_opening_hours()\n \n     def parse_store(self, response):\n-        data = json.loads(response.xpath('//script[@type=\"application/ld+json\"]/text()').extract_first())\n-        data = data['@graph'][0]\n+        data = response.json()['@graph'][0]\n \n         properties = {\n             \"ref\": data['@id'],\n+            \"website\": data['url'],\n             \"opening_hours\": self.parse_hours(data['openingHoursSpecification']),\n             \"addr_full\": data['address']['streetAddress'],\n             \"city\": data['address']['addressLocality'],\n", "issue": "Spider public_storage is broken\nDuring the global build at 2021-08-04-14-42-45, spider **public_storage** failed with **834 features** and **1879 errors**.\n\nHere's [the log](https://data.alltheplaces.xyz/runs/2021-08-04-14-42-45/logs/public_storage.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-08-04-14-42-45/output/public_storage.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-08-04-14-42-45/output/public_storage.geojson))\n", "before_files": [{"content": "# -*- coding: utf-8 -*-\nimport scrapy\nimport json\n\nfrom locations.items import GeojsonPointItem\nfrom locations.hours import OpeningHours\n\n\nclass PublicStorageSpider(scrapy.Spider):\n    name = \"public_storage\"\n    item_attributes = { 'brand': \"Public Storage\" }\n    allowed_domains = [\"www.publicstorage.com\"]\n    start_urls = (\n        'https://www.publicstorage.com/sitemap_plp.xml',\n    )\n\n    def parse(self, response):\n        response.selector.remove_namespaces()\n        city_urls = response.xpath('//url/loc/text()').extract()\n        for path in city_urls:\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 hour in hours:\n            for day in hour['dayOfWeek']:\n                opening_hours.add_range(\n                    day=day[:2],\n                    open_time=hour[\"opens\"],\n                    close_time=hour[\"closes\"],\n                )\n\n        return opening_hours.as_opening_hours()\n\n    def parse_store(self, response):\n        data = json.loads(response.xpath('//script[@type=\"application/ld+json\"]/text()').extract_first())\n        data = data['@graph'][0]\n\n        properties = {\n            \"ref\": data['@id'],\n            \"opening_hours\": self.parse_hours(data['openingHoursSpecification']),\n            \"addr_full\": data['address']['streetAddress'],\n            \"city\": data['address']['addressLocality'],\n            \"state\": data['address']['addressRegion'],\n            \"postcode\": data['address']['postalCode'],\n            \"phone\": data['telephone'],\n            \"lat\": data['geo']['latitude'],\n            \"lon\": data['geo']['longitude'],\n        }\n\n        yield GeojsonPointItem(**properties)\n", "path": "locations/spiders/public_storage.py"}], "after_files": [{"content": "# -*- coding: utf-8 -*-\nimport scrapy\nimport json\n\nfrom locations.items import GeojsonPointItem\nfrom locations.hours import OpeningHours\n\n\nclass PublicStorageSpider(scrapy.Spider):\n    name = \"public_storage\"\n    item_attributes = { 'brand': \"Public Storage\" }\n    allowed_domains = [\"www.publicstorage.com\"]\n    start_urls = (\n        'https://www.publicstorage.com/sitemap_plp.xml',\n    )\n\n    def parse(self, response):\n        response.selector.remove_namespaces()\n        city_urls = response.xpath('//url/loc/text()').extract()\n        for path in city_urls:\n            yield scrapy.Request(\n                path.strip(),\n                callback=self.load_store,\n            )\n\n    def load_store(self, response):\n        ldjson = response.xpath('//link[@type=\"application/ld+json\"]/@href').get()\n        yield scrapy.Request(response.urljoin(ldjson), callback=self.parse_store)\n\n    def parse_hours(self, hours):\n        opening_hours = OpeningHours()\n\n        for hour in hours:\n            for day in hour['dayOfWeek']:\n                opening_hours.add_range(\n                    day=day[:2],\n                    open_time=hour[\"opens\"],\n                    close_time=hour[\"closes\"],\n                )\n\n        return opening_hours.as_opening_hours()\n\n    def parse_store(self, response):\n        data = response.json()['@graph'][0]\n\n        properties = {\n            \"ref\": data['@id'],\n            \"website\": data['url'],\n            \"opening_hours\": self.parse_hours(data['openingHoursSpecification']),\n            \"addr_full\": data['address']['streetAddress'],\n            \"city\": data['address']['addressLocality'],\n            \"state\": data['address']['addressRegion'],\n            \"postcode\": data['address']['postalCode'],\n            \"phone\": data['telephone'],\n            \"lat\": data['geo']['latitude'],\n            \"lon\": data['geo']['longitude'],\n        }\n\n        yield GeojsonPointItem(**properties)\n", "path": "locations/spiders/public_storage.py"}]}