Scrapy回调函数

时间:2016-04-06 02:20:36

标签: python scrapy yield-return

我有一个基本的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. 最后,这里有获取产品详细信息的功能

      

    我认为最后一个parse_detailed_contents是我遇到问题的地方

    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
    
  6. 问题是我的脚本会返回第一个链接的项目[' prod_details'],但不会返回后续链接的任何项目。

      

    这是因为url_2在所有产品中都被传递了吗?

    请有人帮忙。非常感谢提前!

1 个答案:

答案 0 :(得分:2)

尝试添加 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