0

そのため、ページをクロールし、遭遇した各アイテムのデータを収集するスパイダーがあります。項目にオプションがない場合は、単純に項目をパイプラインに送ります。オプションがある場合は、オプション リストのリストを組み立て、オプションの一意の組み合わせごとに要求を送信します (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&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

最初のメソッドの for ループは、オプションのセットごとに 1 回、正しく起動します。コールバックが存在しないメソッドに対するものである場合 (これは良いことです)、Request はエラーをスローしますが、コールバック メソッドの print ステートメントは決して起動せず、アイテムはパイプラインに伝播されません。

私が間違っていること、または正しく行う方法についてのアドバイスをいただければ幸いです。

ありがとう

4

1 に答える 1

0

少し時間がかかり、少し絶望的でしたが、私はこれを考え出しました. 私はこのスパイダーに CrawlSpider を使用しており、「許可」ルールに ajax URL を追加する必要がありました。それがなければ、URL は追跡も解析もできません。

于 2012-11-01T06:28:35.723 に答える