2016-04-06 146 views
2

我有一个基本的scrapy脚本,在做了以下内容:Scrapy回调函数

  1. Visting网站
  2. 使用规则来获取所有的网页:

    rules = (
         Rule(LinkExtractor(allow=(), restrict_xpaths=('//*[@id="pagination_top"]/a',)), callback="parse_page", follow= True), 
         ) 
    
  3. 在每一个页面,获取产品页面的所有链接:

    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 
    

问题是我的脚本重新为第一个链接转变项目['prod_details'],但不会为后续链接返回任何项目。

这是因为所有产品的url_2传递相同吗?

有人请帮忙。提前感谢!

+0

你找到控制台日志的任何错误,同时运行的蜘蛛? – jithin

+0

谢谢@jithin没有错误...脚本打印每个产品的“BEGIN PRODUCT”,但只打印第一个产品的“GETTING DETAILS”..所有后续产品页面只返回“BEGIN PRODUCT' – user6055239

回答

2

尝试添加dont_filter =真

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 
+0

非常感谢@jithin工作!我没有足够的积分来选择你的答案,但我一定会回来,一旦我有足够的。再次感谢! – user6055239

+1

@ user6055239你不需要点来选择一个答案。 – jithin