2016-04-06 131 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