Функция обратного вызова Scrapy

У меня есть базовый скрипт scrapy, который делает следующее:

  1. Посещение веб-сайта
  2. Использование правила для получения всех страниц:

     rules = (
             Rule(LinkExtractor(allow=(), restrict_xpaths=('//*[@id="pagination_top"]/a',)), callback="parse_page", follow= True),
             )
    
  3. Внутри каждой страницы получение всех ссылок на prod страницы:

    def parse_page(self, response):
        for href in response.css("#prod_category > ul > li > a::attr('href')"):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_dir_contents)
    
  4. и посещение каждой из страниц продукта, чтобы получить подробную информацию о продукте. Затем я получаю дополнительную информацию по другой ссылке

    def parse_dir_contents(self, response):
         # select xpath here
         print '________________________BEGIN PRODUCT________________________'
         item = detailedItem()
         item['title'] = sites.xpath('//*[@id="product-name"]/text()').extract()
    
         # get url_2 from this page
    
         request = scrapy.Request(url_2, callback=self.parse_detailed_contents)
         request.meta['item'] = item
         yield request
    
  5. #P5# <блочная цитата> #P6#
    def parse_detailed_contents(self, response):
        item = response.meta['item']
        sel = Selector(response)
        sites = sel.xpath('//*[@id="prod-details"]')
    
        print '________________________GETTING DETAILS________________________'
        item['prod_details'] = sites.xpath('//*[@id="prod-details"]/div/text()').extract()
    
        return item
    

Проблема в том, что мой скрипт возвращает item['prod_details'] для первой ссылки, но не возвращает никаких элементов для последующих ссылок.

Это потому, что url_2 передается одинаково для всех продуктов?

Может кто-нибудь, пожалуйста, помогите. Заранее большое спасибо!


person user6055239    schedule 06.04.2016    source источник
comment
Вы нашли какие-либо ошибки в журнале консоли во время работы паука?   -  person jithin    schedule 06.04.2016
comment
Спасибо @jithin Никаких ошибок... Сценарий печатает НАЧАЛО ПРОДУКТА для каждого продукта, но печатает ПОЛУЧЕНИЕ ПОДРОБНОЙ ИНФОРМАЦИИ только для первого продукта. Все последующие страницы продукта возвращают только НАЧАЛО ПРОДУКТА'   -  person user6055239    schedule 06.04.2016


Ответы (1)


попробуйте добавить dont_filter=True

def parse_dir_contents(self, response):
 # select xpath here
 print '________________________BEGIN PRODUCT________________________'
 item = detailedItem()
 item['title'] = sites.xpath('//*[@id="product-name"]/text()').extract()

 # get url_2 from this page

 request = scrapy.Request(url_2, callback=self.parse_detailed_contents,dont_filter=True)
 request.meta['item'] = item
 yield request
person jithin    schedule 06.04.2016
comment
Большое спасибо @jithin, ЭТО РАБОТАЛО! У меня недостаточно баллов, чтобы выбрать ваш ответ, но я обязательно вернусь, когда их будет достаточно. Спасибо еще раз! - person user6055239; 06.04.2016