Scrapy crawler to parse data recursively
The code is quite clean and easy to read, good job!

I would only focus on couple things:


remove extra spaces around = when it is used to define a keyword argument
CSS selectors are more appropriate and reliable when it comes to handling multi-valued class attribute than XPath expressions. Plus, they are more concise and generally faster
naming - for links in should actually be for link in
as for the target_page method, I don't think you need a loop - if I understand correctly, there should be a single "product" parsed at this point
you may use start_urls instead of start_requests()


All things taken into account:

import scrapy


class SephoraSpider(scrapy.Spider):
    name = "sephorasp"
    start_urls = ["https://www.sephora.ae/en/stores/"]

    def parse(self, response):
        for link in response.css('ul.nav-primary a.level0::attr(href)').extract():
            yield scrapy.Request(url=link, callback=self.parse_inner_pages)

    def parse_inner_pages(self, response):
        for link in response.css('li.amshopby-cat &gt; a::attr(href)').extract():
            yield scrapy.Request(url=link, callback=self.target_page)

    def target_page(self, response):
        name = response.css('.product-name &gt; a::text').extract_first()
        price = response.css('span.price::text').extract_first()
        yield {'name': name, 'price': price}


(not tested)