small web scraper to read product highlight from given urls
Splitting lines
Don't call splitlines() here:
org_file = open('config/organisation.txt', 'r')
return org_file.read().splitlines()

The file object itself is an iterator over its lines. Also, use a context manager to ensure file closure:
with open('config/organisation.txt', 'r') as f:
    return {line.rstrip() for line in f}

This is a set comprehension. You want a set because you're only ever checking for membership, and this will be more efficient.
Generator simplification
You don't really need to yield here:
for url in start_urls:
    yield scrapy.Request(url=url, callback=self.parse)

Instead,
return (
    scrapy.Request(url=url, callback=self.parse)
    for url in start_urls
)

Strongly-typed results
Since you're more experienced in .NET, consider how you would traditionally represent this:
yield {
    'product_id': product_highlight.css('[data-id=&quot;ProductId&quot;] span::text').get(),
    'title': product_highlight.css('[data-title=&quot;ProductTitle&quot;] h1::text').get(),
    'price': response.css('[data-price=&quot;ProductPrice&quot;] span span::text').get(),
    'organisation': organisation,
}
            

Hint: it's not a dictionary. You would do better to make a class (perhaps a @dataclass) with well-defined members, and set your return type hint for this method to  -&gt; Iterable[ResultType].