Scrapy - 无法在XMLFeedSpider中发出其他请求

时间:2017-06-19 16:47:44

标签: python python-3.x scrapy scrapy-spider

我有一只使用XMLFeedSpider的scrapy蜘蛛。除了为parse_node()中的每个节点返回的数据外,我还需要另外请求以获取更多数据。唯一的问题是,如果我从parse_node()发出额外请求,则根本不会返回任何内容:

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

如果我将parse_node()的最后一行更改为return item,它可以正常工作(当然不会在项目中设置price_per)。

知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

您是否尝试过检查item['link']的内容?如果它是相对链接(例如:/products?id=5),则URL不会返回任何内容,请求将失败。您需要确保它是可解析的链接(例如:https://www.myspiders.com/products?id=5)。

答案 1 :(得分: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