2026-03-12 15:19:16 [crawlers.middlewares.monitoring_spider_middleware] ERROR: 'int' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable
2026-03-12 15:19:16 [crawlers.middlewares.monitoring_spider_middleware] ERROR: 'int' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/id_gen_middleware.py", line 20, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 17, in as_async_generator
for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 109, in process_sync
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable
2026-03-12 15:19:16 [crawlers.middlewares.monitoring_spider_middleware] ERROR: 'int' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/report_download_middleware.py", line 32, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/id_gen_middleware.py", line 20, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 17, in as_async_generator
for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 109, in process_sync
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable
2026-03-12 15:19:16 [crawlers.middlewares.monitoring_spider_middleware] ERROR: 'int' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/photo_download_middleware.py", line 42, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/report_download_middleware.py", line 32, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/id_gen_middleware.py", line 20, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 17, in as_async_generator
for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 109, in process_sync
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable
2026-03-12 15:19:17 [crawlers.middlewares.monitoring_spider_middleware] ERROR: 'int' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/depth.py", line 35, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/photo_download_middleware.py", line 42, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/report_download_middleware.py", line 32, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/id_gen_middleware.py", line 20, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 17, in as_async_generator
for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 109, in process_sync
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable
2026-03-12 15:19:17 [crawlers.middlewares.monitoring_spider_middleware] ERROR: 'int' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/urllength.py", line 30, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/depth.py", line 35, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/photo_download_middleware.py", line 42, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/report_download_middleware.py", line 32, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/id_gen_middleware.py", line 20, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 17, in as_async_generator
for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 109, in process_sync
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable
2026-03-12 15:19:17 [crawlers.middlewares.monitoring_spider_middleware] ERROR: 'int' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/referer.py", line 355, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/urllength.py", line 30, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/depth.py", line 35, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/photo_download_middleware.py", line 42, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/report_download_middleware.py", line 32, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/id_gen_middleware.py", line 20, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 17, in as_async_generator
for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 109, in process_sync
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable
2026-03-12 15:19:17 [scrapy.core.scraper] ERROR: Spider error processing <GET https://arval-prod-euw-appservice-portalapi.azurewebsites.net/api/Announcements/3?orderBy=salePriceGross%7Casc&pageNumber=1&pageSize=20&purchaseOption=sale&reservationLabels=available> (referer: https://autoselect.arval.co.uk)
Traceback (most recent call last):
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/defer.py", line 295, in aiter_errback
yield await it.__anext__()
^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/python.py", line 374, in __anext__
return await self.data.__anext__()
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/python.py", line 355, in _async_chain
async for o in as_async_generator(it):
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 14, in as_async_generator
async for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/python.py", line 374, in __anext__
return await self.data.__anext__()
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/python.py", line 355, in _async_chain
async for o in as_async_generator(it):
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 14, in as_async_generator
async for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy_zyte_api/_middlewares.py", line 206, in process_spider_output_async
async for item_or_request in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 42, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/referer.py", line 355, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/urllength.py", line 30, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/local/lib/python3.11/dist-packages/scrapy/spidermiddlewares/depth.py", line 35, in process_spider_output_async
async for r in result or ():
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/photo_download_middleware.py", line 42, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/report_download_middleware.py", line 32, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 121, in process_async
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 118, in process_async
async for r in iterable:
File "/usr/src/app/crawlers/middlewares/id_gen_middleware.py", line 20, in process_spider_output
async for item in result:
File "/usr/local/lib/python3.11/dist-packages/scrapy/utils/asyncgen.py", line 17, in as_async_generator
for r in it:
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 109, in process_sync
exception_result = self._process_spider_exception(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 150, in _process_spider_exception
result = method(response=response, exception=exception, spider=spider)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/middlewares/monitoring_spider_middleware.py", line 73, in process_spider_exception
raise exception
File "/usr/local/lib/python3.11/dist-packages/scrapy/core/spidermw.py", line 106, in process_sync
for r in iterable:
File "/usr/src/app/crawlers/spiders/arval.py", line 191, in parse_listings
if not self.needs_full_scrape(identifier):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 397, in needs_full_scrape
scrape_type = self._scrape_needed(identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 448, in _scrape_needed
res = self.load_from_azure_tables("ScrapedListings", self.name, identifier)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/crawlers/spiders/base.py", line 251, in load_from_azure_tables
return connect_and_load_data(table, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 215, in connect_and_load_data
return load_data(table_client, partition_key, row_key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 142, in load_data
row_key = sanitize_key(row_key)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/common/azure_tables.py", line 124, in sanitize_key
for c in key:
TypeError: 'int' object is not iterable