We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Spider ljsilvers is broken
During the global build at 2021-06-02-14-42-40, spider **ljsilvers** failed with **0 features** and **0 errors**.

Here's [the log](https://data.alltheplaces.xyz/runs/2021-06-02-14-42-40/logs/ljsilvers.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-06-02-14-42-40/output/ljsilvers.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-06-02-14-42-40/output/ljsilvers.geojson))
Long John Silver's
http://www.ljsilvers.com/

(location search box top right)

--- 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/ljsilvers.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 LjsilversSpider(scrapy.Spider):
10     name = "ljsilvers"
11     item_attributes = { 'brand': "Long John Silver's", 'brand_wikidata': "Q1535221" }
12     allowed_domains = ["ljsilvers.com"]
13     start_urls = (
14         'http://www.ljsilvers.com/locator?postalcode=76010',
15     )
16 
17     def parse(self, response):
18         data = response.body_as_unicode()
19         base_data = re.search(r'dataout\s--Array\s\((.*)\)\s\s--><style type="text/css">', data, re.DOTALL).group(1)
20         detail_matches = re.findall(r'\((.*?)\)', base_data, re.DOTALL)
21 
22         for detail_match in detail_matches:
23             key_values = re.findall(r'(.*?)\s=>\s(.*)', detail_match)
24             props = {}
25 
26             for key_value in key_values:
27                 key = key_value[0].strip()
28                 value = key_value[1].strip()
29 
30                 if key == '[storeID]':
31                     props['ref'] = value
32                 if key == '[address]':
33                     props['addr_full'] = value
34                 if key == '[city]':
35                     props['city'] = value
36                 if key == '[state]':
37                     props['state'] = value
38                 if key == '[zip]':
39                     props['postcode'] = value
40                 if key == '[phone_number]':
41                     props['phone'] = value
42                 if key == '[latitude]':
43                     props['lat'] = value
44                 if key == '[longitude]':
45                     props['lon'] = value
46 
47             yield GeojsonPointItem(**props)
48
```
--- 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/ljsilvers.py b/locations/spiders/ljsilvers.py
--- a/locations/spiders/ljsilvers.py
+++ b/locations/spiders/ljsilvers.py
@@ -1,47 +1,32 @@
 # -*- coding: utf-8 -*-
 import scrapy
-import json
-import re
 
 from locations.items import GeojsonPointItem
 
 
 class LjsilversSpider(scrapy.Spider):
     name = "ljsilvers"
-    item_attributes = { 'brand': "Long John Silver's", 'brand_wikidata': "Q1535221" }
+    item_attributes = {"brand": "Long John Silver's", "brand_wikidata": "Q1535221"}
     allowed_domains = ["ljsilvers.com"]
     start_urls = (
-        'http://www.ljsilvers.com/locator?postalcode=76010',
+        "https://viewer.blipstar.com/searchdbnew?uid=2483677&lat=45&lng=-103&value=10000",
     )
 
     def parse(self, response):
-        data = response.body_as_unicode()
-        base_data = re.search(r'dataout\s--Array\s\((.*)\)\s\s--><style type="text/css">', data, re.DOTALL).group(1)
-        detail_matches = re.findall(r'\((.*?)\)', base_data, re.DOTALL)
-
-        for detail_match in detail_matches:
-            key_values = re.findall(r'(.*?)\s=>\s(.*)', detail_match)
-            props = {}
-
-            for key_value in key_values:
-                key = key_value[0].strip()
-                value = key_value[1].strip()
-
-                if key == '[storeID]':
-                    props['ref'] = value
-                if key == '[address]':
-                    props['addr_full'] = value
-                if key == '[city]':
-                    props['city'] = value
-                if key == '[state]':
-                    props['state'] = value
-                if key == '[zip]':
-                    props['postcode'] = value
-                if key == '[phone_number]':
-                    props['phone'] = value
-                if key == '[latitude]':
-                    props['lat'] = value
-                if key == '[longitude]':
-                    props['lon'] = value
-
-            yield GeojsonPointItem(**props)
+        for row in response.json():
+            if row.keys() == {"fulltotal", "total", "units"}:
+                continue
+            addr = scrapy.Selector(text=row["a"])
+            properties = {
+                "name": row["n"],
+                "ref": row["bpid"],
+                "lat": row["lat"],
+                "lon": row["lng"],
+                "addr_full": addr.xpath("//p/text()").extract_first(),
+                "city": addr.css(".storecity ::text").extract_first(),
+                "state": addr.css(".storestate ::text").extract_first(),
+                "postcode": addr.css(".storepostalcode ::text").extract_first(),
+                "country": row["c"],
+                "phone": row.get("p"),
+            }
+            yield GeojsonPointItem(**properties)

{"golden_diff": "diff --git a/locations/spiders/ljsilvers.py b/locations/spiders/ljsilvers.py\n--- a/locations/spiders/ljsilvers.py\n+++ b/locations/spiders/ljsilvers.py\n@@ -1,47 +1,32 @@\n # -*- coding: utf-8 -*-\n import scrapy\n-import json\n-import re\n \n from locations.items import GeojsonPointItem\n \n \n class LjsilversSpider(scrapy.Spider):\n     name = \"ljsilvers\"\n-    item_attributes = { 'brand': \"Long John Silver's\", 'brand_wikidata': \"Q1535221\" }\n+    item_attributes = {\"brand\": \"Long John Silver's\", \"brand_wikidata\": \"Q1535221\"}\n     allowed_domains = [\"ljsilvers.com\"]\n     start_urls = (\n-        'http://www.ljsilvers.com/locator?postalcode=76010',\n+        \"https://viewer.blipstar.com/searchdbnew?uid=2483677&lat=45&lng=-103&value=10000\",\n     )\n \n     def parse(self, response):\n-        data = response.body_as_unicode()\n-        base_data = re.search(r'dataout\\s--Array\\s\\((.*)\\)\\s\\s--><style type=\"text/css\">', data, re.DOTALL).group(1)\n-        detail_matches = re.findall(r'\\((.*?)\\)', base_data, re.DOTALL)\n-\n-        for detail_match in detail_matches:\n-            key_values = re.findall(r'(.*?)\\s=>\\s(.*)', detail_match)\n-            props = {}\n-\n-            for key_value in key_values:\n-                key = key_value[0].strip()\n-                value = key_value[1].strip()\n-\n-                if key == '[storeID]':\n-                    props['ref'] = value\n-                if key == '[address]':\n-                    props['addr_full'] = value\n-                if key == '[city]':\n-                    props['city'] = value\n-                if key == '[state]':\n-                    props['state'] = value\n-                if key == '[zip]':\n-                    props['postcode'] = value\n-                if key == '[phone_number]':\n-                    props['phone'] = value\n-                if key == '[latitude]':\n-                    props['lat'] = value\n-                if key == '[longitude]':\n-                    props['lon'] = value\n-\n-            yield GeojsonPointItem(**props)\n+        for row in response.json():\n+            if row.keys() == {\"fulltotal\", \"total\", \"units\"}:\n+                continue\n+            addr = scrapy.Selector(text=row[\"a\"])\n+            properties = {\n+                \"name\": row[\"n\"],\n+                \"ref\": row[\"bpid\"],\n+                \"lat\": row[\"lat\"],\n+                \"lon\": row[\"lng\"],\n+                \"addr_full\": addr.xpath(\"//p/text()\").extract_first(),\n+                \"city\": addr.css(\".storecity ::text\").extract_first(),\n+                \"state\": addr.css(\".storestate ::text\").extract_first(),\n+                \"postcode\": addr.css(\".storepostalcode ::text\").extract_first(),\n+                \"country\": row[\"c\"],\n+                \"phone\": row.get(\"p\"),\n+            }\n+            yield GeojsonPointItem(**properties)\n", "issue": "Spider ljsilvers is broken\nDuring the global build at 2021-06-02-14-42-40, spider **ljsilvers** failed with **0 features** and **0 errors**.\n\nHere's [the log](https://data.alltheplaces.xyz/runs/2021-06-02-14-42-40/logs/ljsilvers.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-06-02-14-42-40/output/ljsilvers.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-06-02-14-42-40/output/ljsilvers.geojson))\nLong John Silver's\nhttp://www.ljsilvers.com/\r\n\r\n(location search box top right)\n", "before_files": [{"content": "# -*- coding: utf-8 -*-\nimport scrapy\nimport json\nimport re\n\nfrom locations.items import GeojsonPointItem\n\n\nclass LjsilversSpider(scrapy.Spider):\n    name = \"ljsilvers\"\n    item_attributes = { 'brand': \"Long John Silver's\", 'brand_wikidata': \"Q1535221\" }\n    allowed_domains = [\"ljsilvers.com\"]\n    start_urls = (\n        'http://www.ljsilvers.com/locator?postalcode=76010',\n    )\n\n    def parse(self, response):\n        data = response.body_as_unicode()\n        base_data = re.search(r'dataout\\s--Array\\s\\((.*)\\)\\s\\s--><style type=\"text/css\">', data, re.DOTALL).group(1)\n        detail_matches = re.findall(r'\\((.*?)\\)', base_data, re.DOTALL)\n\n        for detail_match in detail_matches:\n            key_values = re.findall(r'(.*?)\\s=>\\s(.*)', detail_match)\n            props = {}\n\n            for key_value in key_values:\n                key = key_value[0].strip()\n                value = key_value[1].strip()\n\n                if key == '[storeID]':\n                    props['ref'] = value\n                if key == '[address]':\n                    props['addr_full'] = value\n                if key == '[city]':\n                    props['city'] = value\n                if key == '[state]':\n                    props['state'] = value\n                if key == '[zip]':\n                    props['postcode'] = value\n                if key == '[phone_number]':\n                    props['phone'] = value\n                if key == '[latitude]':\n                    props['lat'] = value\n                if key == '[longitude]':\n                    props['lon'] = value\n\n            yield GeojsonPointItem(**props)\n", "path": "locations/spiders/ljsilvers.py"}], "after_files": [{"content": "# -*- coding: utf-8 -*-\nimport scrapy\n\nfrom locations.items import GeojsonPointItem\n\n\nclass LjsilversSpider(scrapy.Spider):\n    name = \"ljsilvers\"\n    item_attributes = {\"brand\": \"Long John Silver's\", \"brand_wikidata\": \"Q1535221\"}\n    allowed_domains = [\"ljsilvers.com\"]\n    start_urls = (\n        \"https://viewer.blipstar.com/searchdbnew?uid=2483677&lat=45&lng=-103&value=10000\",\n    )\n\n    def parse(self, response):\n        for row in response.json():\n            if row.keys() == {\"fulltotal\", \"total\", \"units\"}:\n                continue\n            addr = scrapy.Selector(text=row[\"a\"])\n            properties = {\n                \"name\": row[\"n\"],\n                \"ref\": row[\"bpid\"],\n                \"lat\": row[\"lat\"],\n                \"lon\": row[\"lng\"],\n                \"addr_full\": addr.xpath(\"//p/text()\").extract_first(),\n                \"city\": addr.css(\".storecity ::text\").extract_first(),\n                \"state\": addr.css(\".storestate ::text\").extract_first(),\n                \"postcode\": addr.css(\".storepostalcode ::text\").extract_first(),\n                \"country\": row[\"c\"],\n                \"phone\": row.get(\"p\"),\n            }\n            yield GeojsonPointItem(**properties)\n", "path": "locations/spiders/ljsilvers.py"}]}