scrapy 2.3 XMLFeedSpider

2021-06-09 10:07 更新
classscrapy.spiders.XMLFeedSpider

XMLFeedSpider是為解析XML提要而設(shè)計(jì)的,它通過(guò)使用特定的節(jié)點(diǎn)名對(duì)這些提要進(jìn)行迭代。迭代器可以從以下選項(xiàng)中選擇: iternodes , xml 和 html . 建議使用 iternodes 由于性能原因,迭代器 xml 和 html 迭代器一次生成整個(gè)DOM以便解析它。然而,使用 html 因?yàn)榈髟诜治鰩в绣e(cuò)誤標(biāo)記的XML時(shí)可能很有用。

要設(shè)置迭代器和標(biāo)記名,必須定義以下類(lèi)屬性:

iterator

定義要使用的迭代器的字符串。它可以是:

  • 'iternodes' -基于正則表達(dá)式的快速迭代器

  • 'html' -使用的迭代器 ?Selector? . 請(qǐng)記住,這使用了DOM解析,必須將所有的DOM加載到內(nèi)存中,這對(duì)于大型提要來(lái)說(shuō)可能是一個(gè)問(wèn)題。

  • 'xml' -使用的迭代器 ?Selector? . 請(qǐng)記住,這使用了DOM解析,必須將所有的DOM加載到內(nèi)存中,這對(duì)于大型提要來(lái)說(shuō)可能是一個(gè)問(wèn)題。

默認(rèn)為: 'iternodes' .

itertag

具有要迭代的節(jié)點(diǎn)(或元素)名稱(chēng)的字符串。例子::

itertag = 'product'
namespaces

列表 (prefix, uri) 定義該文檔中可用的命名空間的元組,這些命名空間將使用此蜘蛛進(jìn)行處理。這個(gè) prefix 和 uri 將用于使用 ?register_namespace()? 方法。

然后,可以在 ?itertag? 屬性。

例子:

class YourSpider(XMLFeedSpider):

    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]
    itertag = 'n:url'
    # ...

除了這些新屬性之外,這個(gè)蜘蛛還具有以下可重寫(xiě)的方法:

adapt_response(response)

一種方法,當(dāng)響應(yīng)從蜘蛛中間件到達(dá)時(shí),在蜘蛛開(kāi)始解析它之前,立即接收響應(yīng)。它可以用于在解析響應(yīng)體之前對(duì)其進(jìn)行修改。此方法接收響應(yīng)并返回響應(yīng)(可以是相同的或另一個(gè)響應(yīng))。

parse_node(responseselector)

對(duì)與提供的標(biāo)記名匹配的節(jié)點(diǎn)調(diào)用此方法 (itertag )接收響應(yīng)和 ?Selector? 對(duì)于每個(gè)節(jié)點(diǎn)。重寫(xiě)此方法是必需的。否則,你的蜘蛛就不能工作了。此方法必須返回 item object ,A  ?Request?  對(duì)象,或包含任何對(duì)象的iterable。

process_results(responseresults)

這個(gè)方法是為spider返回的每個(gè)結(jié)果(項(xiàng)或請(qǐng)求)調(diào)用的,它用于在將結(jié)果返回到框架核心之前執(zhí)行所需的任何最后一次處理,例如設(shè)置項(xiàng)id。它接收結(jié)果列表和產(chǎn)生這些結(jié)果的響應(yīng)。它必須返回結(jié)果列表(項(xiàng)或請(qǐng)求)。

警告

由于其內(nèi)部實(shí)現(xiàn),在編寫(xiě)時(shí)必須顯式設(shè)置新請(qǐng)求的回調(diào) XMLFeedSpider -基于蜘蛛;否則會(huì)發(fā)生意外行為。

XmlFeedSpider示例

這些蜘蛛很容易使用,讓我們來(lái)看一個(gè)例子:

from scrapy.spiders import XMLFeedSpider
from myproject.items import TestItem

class MySpider(XMLFeedSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/feed.xml']
    iterator = 'iternodes'  # This is actually unnecessary, since it's the default value
    itertag = 'item'

    def parse_node(self, response, node):
        self.logger.info('Hi, this is a <%s> node!: %s', self.itertag, ''.join(node.getall()))

        item = TestItem()
        item['id'] = node.xpath('@id').get()
        item['name'] = node.xpath('name').get()
        item['description'] = node.xpath('description').get()
        return item

基本上,我們所做的就是創(chuàng)建一個(gè)蜘蛛,從給定的 ?start_urls? ,然后遍歷 ?item? 標(biāo)簽,打印出來(lái),并將一些隨機(jī)數(shù)據(jù)存儲(chǔ)在 ?Item? .


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)