所以,我有一个蜘蛛爬行页面,收集它遇到的每个项目的数据。如果该项目没有选项,它只是将项目沿管道发送。如果有选项,它会组合一个选项列表列表,并为每个唯一的选项组合发送请求(返回为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循环正确触发,每组选项一次。如果回调是针对不存在的方法(这很好),则Request会抛出错误,但回调方法中的print语句永远不会触发,也不会将项目传播到管道中。
对于我做错了什么或如何正确行事的任何建议都将不胜感激。
由于
答案 0 :(得分:0)
花了一些时间和一点点绝望,但我想出了这个。我正在为这个蜘蛛使用CrawlSpider,我不得不将ajax URL添加到'allow'规则中。没有它,该网址既不符合要求也不能解析。