2012-10-31 60 views
0

因此,我有一個抓取頁面的蜘蛛,爲它遇到的每個項目收集數據。如果該項目沒有選項,則只需將該項目沿管道發送。如果有選項,它將彙編一個選項列表列表,併爲每個唯一的選項組合發送一個請求(作爲HTML代碼片段返回,所以我把它當作XML處理)。對於每個選項組合,它提取項目的價格並將其發送到管道。只有它沒有。Scrapy:爲抓取頁面中的選項選擇創建多個項目

下面是一些代碼:

#spider code above here that does all the normal stuff, 
#plus gets and organize all options. Then this: 

for optLists in uberList: 
    queryString = '?func=Options&currentOption=1&Modal=False&AddUniqueID=False&sku=' + sku + '&option1=' + optLists[0] + '&option2=' + optLists[1] + '&option3=' + optLists[2] 
    reqURL = urljoin(baseAjaxURL, queryString) 
    req = Request(url=reqURL, 
       callback=self.parse_ajax, 
       meta = {'item' : item}, 
       ) 
    self.log('simplified item: ' + reqURL, level=log.DEBUG) 
    yield req 

而且回調函數:

def parse_ajax(self, response): 
    print 'parsing ajax' 
    xxs = XmlXPathSelector(response) 
    item = response.meta['item'] 
    item['price'] = xxs.select("normalize-space(substring-before(substring-after(.//skuMainPrice/text(), 'ppPrice:'),'/span'))").extract()[0] 
    print 'parse_ajax price: ', item['price'] 
    return item 

的在第一種方法火災循環正常,一旦每組選項。如果回調是不存在的方法(這很好),那麼Request會拋出一個錯誤,但回調方法中的print語句不會觸發,也不會將該項傳播到管道中。

任何意見我做錯了什麼或如何做到這一點正確的將不勝感激。

感謝

+0

通常當請求失敗時會發生此行爲,因此不會調用回調函數。你可以驗證AJAX網址的請求是否正確? –

+0

我已經打印出reqURL並在Firefox中跟隨鏈接。這給了我預期的HTML片段。 – GMBill

+0

你也可以驗證Scrapy處理200 OK的請求嗎? –

回答

0

它花了一些時間和一點點絕望,但我想這一個。我爲這個蜘蛛使用CrawlSpider,並且我必須將ajax URL添加到'allow'規則中。沒有它,該網址既不符合也不解析。