そのため、ページをクロールし、遭遇した各アイテムのデータを収集するスパイダーがあります。項目にオプションがない場合は、単純に項目をパイプラインに送ります。オプションがある場合は、オプション リストのリストを組み立て、オプションの一意の組み合わせごとに要求を送信します (HTML スニペットとして返されるため、XML のように扱います)。オプションの組み合わせごとに、アイテムの価格を抽出し、それをパイプに送ります。ただ、そうではありません。
ここにいくつかのコードがあります:
#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¤tOption=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
最初のメソッドの for ループは、オプションのセットごとに 1 回、正しく起動します。コールバックが存在しないメソッドに対するものである場合 (これは良いことです)、Request はエラーをスローしますが、コールバック メソッドの print ステートメントは決して起動せず、アイテムはパイプラインに伝播されません。
私が間違っていること、または正しく行う方法についてのアドバイスをいただければ幸いです。
ありがとう