prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  @spider=western_union in Poland list `amenity=money_transfer` POIs not actually existing as separate objects
  very similar to #5881
  
  It would be better to drop main tag over showing it like this. And in this case it seems dubious to me is it mappable as all on https://www.openstreetmap.org/node/5873034793 bank note.
  
  https://www.alltheplaces.xyz/map/#16.47/50.076332/20.032325
  
  https://location.westernunion.com/pl/malopolskie/krakow/e6d7165e8f86df94dacd8de6f1bfc780
  
  I can visit that place and check in which form Western Union appears there.
  [WesternUnion] Remove top level tag
  Fixes #5889
  @spider=western_union in Poland list `amenity=money_transfer` POIs not actually existing as separate objects
  very similar to #5881
  
  It would be better to drop main tag over showing it like this. And in this case it seems dubious to me is it mappable as all on https://www.openstreetmap.org/node/5873034793 bank note.
  
  https://www.alltheplaces.xyz/map/#16.47/50.076332/20.032325
  
  https://location.westernunion.com/pl/malopolskie/krakow/e6d7165e8f86df94dacd8de6f1bfc780
  
  I can visit that place and check in which form Western Union appears there.
  
  --- 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/western_union.py`
  Content:
  ```
  1 import json
  2 
  3 from scrapy import Spider
  4 from scrapy.downloadermiddlewares.retry import get_retry_request
  5 from scrapy.http import JsonRequest
  6 
  7 from locations.categories import Categories
  8 from locations.dict_parser import DictParser
  9 from locations.geo import point_locations
  10 from locations.hours import OpeningHours
  11 
  12 
  13 class WesternUnionSpider(Spider):
  14     name = "western_union"
  15     item_attributes = {"brand": "Western Union", "brand_wikidata": "Q861042", "extras": Categories.MONEY_TRANSFER.value}
  16     allowed_domains = ["www.westernunion.com"]
  17     # start_urls[0] is a GraphQL endpoint.
  18     start_urls = ["https://www.westernunion.com/router/"]
  19     download_delay = 0.2
  20 
  21     def request_page(self, latitude, longitude, page_number):
  22         # An access code for querying the GraphQL endpoint is
  23         # required, This is constant across different browser
  24         # sessions and the same for all users of the website.
  25         headers = {
  26             "x-wu-accesscode": "RtYV3XDz9EA",
  27             "x-wu-operationName": "locations",
  28         }
  29         # The GraphQL query does not appear to allow for the page
  30         # size to be increased. Typically the page size is observed
  31         # by default to be 15 results per page.
  32         #
  33         # A radius of 350km is used by the API to search around each
  34         # provided coordinate. There does not appear to be a way to
  35         # specify an alternative radius.
  36         data = {
  37             "query": "query locations($req:LocationInput) { locations(input: $req) }",
  38             "variables": {
  39                 "req": {
  40                     "longitude": longitude,
  41                     "latitude": latitude,
  42                     "country": "US",  # Seemingly has no effect.
  43                     "openNow": "",
  44                     "services": [],
  45                     "sortOrder": "Distance",
  46                     "pageNumber": str(page_number),
  47                 }
  48             },
  49         }
  50         yield JsonRequest(url=self.start_urls[0], method="POST", headers=headers, data=data)
  51 
  52     def start_requests(self):
  53         # The GraphQL query searches for locations within a 350km
  54         # radius of supplied coordinates, then returns locations in
  55         # pages of 15 locations each page.
  56         for lat, lon in point_locations("earth_centroids_iseadgg_346km_radius.csv"):
  57             yield from self.request_page(lat, lon, 1)
  58 
  59     def parse(self, response):
  60         # If crawling too fast, the server responds with a JSON
  61         # blob containing an error message. Schedule a retry.
  62         if "results" not in response.json()["data"]["locations"]:
  63             if "errorCode" in response.json()["data"]["locations"]:
  64                 if response.json()["data"]["locations"]["errorCode"] == 500:
  65                     yield get_retry_request(
  66                         response.request, spider=self, max_retry_times=5, reason="Retry after rate limiting error"
  67                     )
  68                     return
  69             # In case of an unhandled error, skip parsing.
  70             return
  71 
  72         # Parse the 15 (or fewer) locations from the response provided.
  73         for location in response.json()["data"]["locations"]["results"]:
  74             item = DictParser.parse(location)
  75             item["website"] = "https://location.westernunion.com/" + location["detailsUrl"]
  76             item["opening_hours"] = OpeningHours()
  77             hours_string = " ".join([f"{day}: {hours}" for (day, hours) in location["detail.hours"].items()])
  78             item["opening_hours"].add_ranges_from_string(hours_string)
  79             yield item
  80 
  81         # On the first response per radius search of a coordinate,
  82         # generate requests for all subsequent pages of results
  83         # found by the API within the 350km search radius.
  84         request_data = json.loads(response.request.body)
  85         current_page = int(request_data["variables"]["req"]["pageNumber"])
  86         total_pages = response.json()["data"]["locations"]["pageCount"]
  87         if current_page == 1 and total_pages > 1:
  88             for page_number in range(2, total_pages, 1):
  89                 yield from self.request_page(
  90                     request_data["variables"]["req"]["latitude"],
  91                     request_data["variables"]["req"]["longitude"],
  92                     page_number,
  93                 )
  94
  ```
  --- 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/western_union.py b/locations/spiders/western_union.py
  --- a/locations/spiders/western_union.py
  +++ b/locations/spiders/western_union.py
  @@ -4,7 +4,6 @@
   from scrapy.downloadermiddlewares.retry import get_retry_request
   from scrapy.http import JsonRequest
   
  -from locations.categories import Categories
   from locations.dict_parser import DictParser
   from locations.geo import point_locations
   from locations.hours import OpeningHours
  @@ -12,7 +11,11 @@
   
   class WesternUnionSpider(Spider):
       name = "western_union"
  -    item_attributes = {"brand": "Western Union", "brand_wikidata": "Q861042", "extras": Categories.MONEY_TRANSFER.value}
  +    item_attributes = {
  +        "brand": "Western Union",
  +        "brand_wikidata": "Q861042",
  +        "extras": {"money_transfer": "western_union"},
  +    }
       allowed_domains = ["www.westernunion.com"]
       # start_urls[0] is a GraphQL endpoint.
       start_urls = ["https://www.westernunion.com/router/"]
  
verification_info: {"golden_diff": "diff --git a/locations/spiders/western_union.py b/locations/spiders/western_union.py\n--- a/locations/spiders/western_union.py\n+++ b/locations/spiders/western_union.py\n@@ -4,7 +4,6 @@\n from scrapy.downloadermiddlewares.retry import get_retry_request\n from scrapy.http import JsonRequest\n \n-from locations.categories import Categories\n from locations.dict_parser import DictParser\n from locations.geo import point_locations\n from locations.hours import OpeningHours\n@@ -12,7 +11,11 @@\n \n class WesternUnionSpider(Spider):\n     name = \"western_union\"\n-    item_attributes = {\"brand\": \"Western Union\", \"brand_wikidata\": \"Q861042\", \"extras\": Categories.MONEY_TRANSFER.value}\n+    item_attributes = {\n+        \"brand\": \"Western Union\",\n+        \"brand_wikidata\": \"Q861042\",\n+        \"extras\": {\"money_transfer\": \"western_union\"},\n+    }\n     allowed_domains = [\"www.westernunion.com\"]\n     # start_urls[0] is a GraphQL endpoint.\n     start_urls = [\"https://www.westernunion.com/router/\"]\n", "issue": "@spider=western_union in Poland list `amenity=money_transfer` POIs not actually existing as separate objects\nvery similar to #5881\r\n\r\nIt would be better to drop main tag over showing it like this. And in this case it seems dubious to me is it mappable as all on https://www.openstreetmap.org/node/5873034793 bank note.\r\n\r\nhttps://www.alltheplaces.xyz/map/#16.47/50.076332/20.032325\r\n\r\nhttps://location.westernunion.com/pl/malopolskie/krakow/e6d7165e8f86df94dacd8de6f1bfc780\r\n\r\nI can visit that place and check in which form Western Union appears there.\n[WesternUnion] Remove top level tag\nFixes #5889\n@spider=western_union in Poland list `amenity=money_transfer` POIs not actually existing as separate objects\nvery similar to #5881\r\n\r\nIt would be better to drop main tag over showing it like this. And in this case it seems dubious to me is it mappable as all on https://www.openstreetmap.org/node/5873034793 bank note.\r\n\r\nhttps://www.alltheplaces.xyz/map/#16.47/50.076332/20.032325\r\n\r\nhttps://location.westernunion.com/pl/malopolskie/krakow/e6d7165e8f86df94dacd8de6f1bfc780\r\n\r\nI can visit that place and check in which form Western Union appears there.\n", "before_files": [{"content": "import json\n\nfrom scrapy import Spider\nfrom scrapy.downloadermiddlewares.retry import get_retry_request\nfrom scrapy.http import JsonRequest\n\nfrom locations.categories import Categories\nfrom locations.dict_parser import DictParser\nfrom locations.geo import point_locations\nfrom locations.hours import OpeningHours\n\n\nclass WesternUnionSpider(Spider):\n    name = \"western_union\"\n    item_attributes = {\"brand\": \"Western Union\", \"brand_wikidata\": \"Q861042\", \"extras\": Categories.MONEY_TRANSFER.value}\n    allowed_domains = [\"www.westernunion.com\"]\n    # start_urls[0] is a GraphQL endpoint.\n    start_urls = [\"https://www.westernunion.com/router/\"]\n    download_delay = 0.2\n\n    def request_page(self, latitude, longitude, page_number):\n        # An access code for querying the GraphQL endpoint is\n        # required, This is constant across different browser\n        # sessions and the same for all users of the website.\n        headers = {\n            \"x-wu-accesscode\": \"RtYV3XDz9EA\",\n            \"x-wu-operationName\": \"locations\",\n        }\n        # The GraphQL query does not appear to allow for the page\n        # size to be increased. Typically the page size is observed\n        # by default to be 15 results per page.\n        #\n        # A radius of 350km is used by the API to search around each\n        # provided coordinate. There does not appear to be a way to\n        # specify an alternative radius.\n        data = {\n            \"query\": \"query locations($req:LocationInput) { locations(input: $req) }\",\n            \"variables\": {\n                \"req\": {\n                    \"longitude\": longitude,\n                    \"latitude\": latitude,\n                    \"country\": \"US\",  # Seemingly has no effect.\n                    \"openNow\": \"\",\n                    \"services\": [],\n                    \"sortOrder\": \"Distance\",\n                    \"pageNumber\": str(page_number),\n                }\n            },\n        }\n        yield JsonRequest(url=self.start_urls[0], method=\"POST\", headers=headers, data=data)\n\n    def start_requests(self):\n        # The GraphQL query searches for locations within a 350km\n        # radius of supplied coordinates, then returns locations in\n        # pages of 15 locations each page.\n        for lat, lon in point_locations(\"earth_centroids_iseadgg_346km_radius.csv\"):\n            yield from self.request_page(lat, lon, 1)\n\n    def parse(self, response):\n        # If crawling too fast, the server responds with a JSON\n        # blob containing an error message. Schedule a retry.\n        if \"results\" not in response.json()[\"data\"][\"locations\"]:\n            if \"errorCode\" in response.json()[\"data\"][\"locations\"]:\n                if response.json()[\"data\"][\"locations\"][\"errorCode\"] == 500:\n                    yield get_retry_request(\n                        response.request, spider=self, max_retry_times=5, reason=\"Retry after rate limiting error\"\n                    )\n                    return\n            # In case of an unhandled error, skip parsing.\n            return\n\n        # Parse the 15 (or fewer) locations from the response provided.\n        for location in response.json()[\"data\"][\"locations\"][\"results\"]:\n            item = DictParser.parse(location)\n            item[\"website\"] = \"https://location.westernunion.com/\" + location[\"detailsUrl\"]\n            item[\"opening_hours\"] = OpeningHours()\n            hours_string = \" \".join([f\"{day}: {hours}\" for (day, hours) in location[\"detail.hours\"].items()])\n            item[\"opening_hours\"].add_ranges_from_string(hours_string)\n            yield item\n\n        # On the first response per radius search of a coordinate,\n        # generate requests for all subsequent pages of results\n        # found by the API within the 350km search radius.\n        request_data = json.loads(response.request.body)\n        current_page = int(request_data[\"variables\"][\"req\"][\"pageNumber\"])\n        total_pages = response.json()[\"data\"][\"locations\"][\"pageCount\"]\n        if current_page == 1 and total_pages > 1:\n            for page_number in range(2, total_pages, 1):\n                yield from self.request_page(\n                    request_data[\"variables\"][\"req\"][\"latitude\"],\n                    request_data[\"variables\"][\"req\"][\"longitude\"],\n                    page_number,\n                )\n", "path": "locations/spiders/western_union.py"}], "after_files": [{"content": "import json\n\nfrom scrapy import Spider\nfrom scrapy.downloadermiddlewares.retry import get_retry_request\nfrom scrapy.http import JsonRequest\n\nfrom locations.dict_parser import DictParser\nfrom locations.geo import point_locations\nfrom locations.hours import OpeningHours\n\n\nclass WesternUnionSpider(Spider):\n    name = \"western_union\"\n    item_attributes = {\n        \"brand\": \"Western Union\",\n        \"brand_wikidata\": \"Q861042\",\n        \"extras\": {\"money_transfer\": \"western_union\"},\n    }\n    allowed_domains = [\"www.westernunion.com\"]\n    # start_urls[0] is a GraphQL endpoint.\n    start_urls = [\"https://www.westernunion.com/router/\"]\n    download_delay = 0.2\n\n    def request_page(self, latitude, longitude, page_number):\n        # An access code for querying the GraphQL endpoint is\n        # required, This is constant across different browser\n        # sessions and the same for all users of the website.\n        headers = {\n            \"x-wu-accesscode\": \"RtYV3XDz9EA\",\n            \"x-wu-operationName\": \"locations\",\n        }\n        # The GraphQL query does not appear to allow for the page\n        # size to be increased. Typically the page size is observed\n        # by default to be 15 results per page.\n        #\n        # A radius of 350km is used by the API to search around each\n        # provided coordinate. There does not appear to be a way to\n        # specify an alternative radius.\n        data = {\n            \"query\": \"query locations($req:LocationInput) { locations(input: $req) }\",\n            \"variables\": {\n                \"req\": {\n                    \"longitude\": longitude,\n                    \"latitude\": latitude,\n                    \"country\": \"US\",  # Seemingly has no effect.\n                    \"openNow\": \"\",\n                    \"services\": [],\n                    \"sortOrder\": \"Distance\",\n                    \"pageNumber\": str(page_number),\n                }\n            },\n        }\n        yield JsonRequest(url=self.start_urls[0], method=\"POST\", headers=headers, data=data)\n\n    def start_requests(self):\n        # The GraphQL query searches for locations within a 350km\n        # radius of supplied coordinates, then returns locations in\n        # pages of 15 locations each page.\n        for lat, lon in point_locations(\"earth_centroids_iseadgg_346km_radius.csv\"):\n            yield from self.request_page(lat, lon, 1)\n\n    def parse(self, response):\n        # If crawling too fast, the server responds with a JSON\n        # blob containing an error message. Schedule a retry.\n        if \"results\" not in response.json()[\"data\"][\"locations\"]:\n            if \"errorCode\" in response.json()[\"data\"][\"locations\"]:\n                if response.json()[\"data\"][\"locations\"][\"errorCode\"] == 500:\n                    yield get_retry_request(\n                        response.request, spider=self, max_retry_times=5, reason=\"Retry after rate limiting error\"\n                    )\n                    return\n            # In case of an unhandled error, skip parsing.\n            return\n\n        # Parse the 15 (or fewer) locations from the response provided.\n        for location in response.json()[\"data\"][\"locations\"][\"results\"]:\n            item = DictParser.parse(location)\n            item[\"website\"] = \"https://location.westernunion.com/\" + location[\"detailsUrl\"]\n            item[\"opening_hours\"] = OpeningHours()\n            hours_string = \" \".join([f\"{day}: {hours}\" for (day, hours) in location[\"detail.hours\"].items()])\n            item[\"opening_hours\"].add_ranges_from_string(hours_string)\n            yield item\n\n        # On the first response per radius search of a coordinate,\n        # generate requests for all subsequent pages of results\n        # found by the API within the 350km search radius.\n        request_data = json.loads(response.request.body)\n        current_page = int(request_data[\"variables\"][\"req\"][\"pageNumber\"])\n        total_pages = response.json()[\"data\"][\"locations\"][\"pageCount\"]\n        if current_page == 1 and total_pages > 1:\n            for page_number in range(2, total_pages, 1):\n                yield from self.request_page(\n                    request_data[\"variables\"][\"req\"][\"latitude\"],\n                    request_data[\"variables\"][\"req\"][\"longitude\"],\n                    page_number,\n                )\n", "path": "locations/spiders/western_union.py"}]}