intercepting the graphql responses beats parsing the DOM, and the zero results warning is worth stealing. listings without a price like "please ask" could break the formatting, and float(price) turns a real 0 into None, so checking price is not None is safer.
the display line probably needs its own fallback too since or 0 would make those listings look free. the scroll loop might quit too early, cause last starts at 0 and a single dry scroll can end things on infinite scroll pages where results load late. so waiting for 2 or 3 dry scrolls in a row could be a better stopping rule. saving one raw response as a fixture would be a good first step before trusting the field names