2017-06-19 15 views
2

私はXMLFeedSpiderを使用しているスクラピースパイダーを持っています。 parse_node()の各ノードで返されたデータだけでなく、さらにデータを取得するために追加のリクエストを行う必要があります。私が得た場合にのみ、問題は、parse_node()何からの追加の要求は全く返されますされていますScrapy - XMLFeedSpiderで追加のリクエストを行うことができません

class MySpidersSpider(XMLFeedSpider): 
    name = "myspiders" 
    namespaces = [('g', 'http://base.google.com/ns/1.0')] 
    allowed_domains = {"www.myspiders.com"} 
    start_urls = [ 
     "https://www.myspiders.com/productMap.xml" 
     ] 
    iterator = 'iternodes' 
    itertag = 'item' 

    def parse_node(self, response, node): 
     if(self.settings['CLOSESPIDER_ITEMCOUNT'] and int(self.settings['CLOSESPIDER_ITEMCOUNT']) == self.item_count): 
      raise CloseSpider('CLOSESPIDER_ITEMCOUNT limit reached - ' + str(self.settings['CLOSESPIDER_ITEMCOUNT'])) 
     else: 
      self.item_count += 1 
     id = node.xpath('id/text()').extract() 
     title = node.xpath('title/text()').extract() 
     link = node.xpath('link/text()').extract() 
     image_link = node.xpath('g:image_link/text()').extract() 
     gtin = node.xpath('g:gtin/text()').extract() 
     product_type = node.xpath('g:product_type/text()').extract() 
     price = node.xpath('g:price/text()').extract() 
     sale_price = node.xpath('g:sale_price/text()').extract() 
     availability = node.xpath('g:availability/text()').extract() 

     item = MySpidersItem() 
     item['id'] = id[0] 
     item['title'] = title[0] 
     item['link'] = link[0] 
     item['image_link'] = image_link[0] 
     item['gtin'] = gtin[0] 
     item['product_type'] = product_type[0] 
     item['price'] = price[0] 
     item['sale_price'] = '' if len(sale_price) == 0 else sale_price[0] 
     item['availability'] = availability[0] 

     yield Request(item['link'], callback=self.parse_details, meta={'item': item}) 

    def parse_details(self, response): 
     item = response.meta['item'] 
     item['price_per'] = 'test' 
     return item 

私はreturn itemparse_node()の最後の行を変更した場合、それは(当然、項目にprice_perを設定せずに)正常に動作します。

私が間違っていることを知っていますか?

答えて

1

私は問題を発見しました。私はparse_node()機能で処理されるアイテムの数を制限していました。しかし、制限のために、私のスパイダーはリクエストが行われる前に終了していました。私parse_details()関数に処理されたアイテムを制限するためにコードを移動しても問題が解決されます。

def parse_details(self, response): 
     if(self.settings['CLOSESPIDER_ITEMCOUNT'] and int(self.settings['CLOSESPIDER_ITEMCOUNT']) == self.item_count): 
      raise CloseSpider('CLOSESPIDER_ITEMCOUNT limit reached - ' + str(self.settings['CLOSESPIDER_ITEMCOUNT'])) 
     else: 
      self.item_count += 1 
     item = response.meta['item'] 
     item['price_per'] = 'test' 
     return item 
1

item['link']の内容を確認しましたか?相対リンク(例:/products?id=5)の場合、URLは何も返されず、要求は失敗します。解決可能なリンクであることを確認する必要があります(例:https://www.myspiders.com/products?id=5)。

+0

はい、URLは解決可能です - 私はデバッグする場合、私は私のブラウザでリンクURLの罰金にアクセスすることができます。また、リンクを 'http:// httpbin.org /'のような任意のものに変更しましたが、私のコールバックはヒットしません(または返されたアイテム)。 – BrynJ

関連する問題