Scrapy XMLFeedSpider

XMLFeedSpider被设计用于通过迭代各个节点来分析XML源,迭代器可以从 iternodes, xml, html 选择。 鉴于 xml 以及 html 迭代器需要先读取所有DOM再分析而引起的性能问题, 一般还是推荐使用iternodes 。在使用错误标记解析XML时,使用html作为迭代器可能很有用。

XMLFeedSpider 类

class scrapy.contrib.spiders.XMLFeedSpider

要设置迭代器和标签名,必须定义以下类属性:

iterator
定义要使用的迭代器的字符串, 默认值为 iternodes,可选项如下:

  • iternodes – 基于正则表达式的快速迭代器
  • html – 使用 Selector 的迭代器。特别提醒,它使用DOM解析,并且必须在内存中加载所有DOM,当数据量大的时候可能会产生问题。
  • xml – 使用 Selector 的迭代器。特别提醒,它使用DOM解析,并且必须在内存中加载所有DOM,当数据量大的时候可能会产生问题。

itertag
具有要迭代的节点(或元素)名称的字符串,例如:

itertag = 'product'

namespaces
一个由 (prefix, url) 元组(tuple)所组成的list。 其定义了在该文档中会被spider处理的可用的命名空间。 prefix 及 uri 会被自动调用 register_namespace()函数注册命名空间。

您可以通过在 itertag 属性中指定节点的 namespace。
例如:

class YourSpider(XMLFeedSpider):

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

除了这些新的属性之外,该spider也有以下可以覆盖(overrideable)的方法:


adapt_response(response)
该方法在spider分析response前被调用。您可以在response被分析之前使用该函数来修改内容(body)。 该方法接受一个response并返回一个response(可以相同也可以不同)。


parse_node(response, selector)
当节点符合提供的标签名时(itertag)该方法被调用。 接收到的response以及相应的 Selector 作为参数传递给该方法。 该方法返回一个 Item 对象或者 Request 对象 或者一个包含二者的可迭代对象(iterable)。


process_results(response, results)
当spider返回结果(item或request)时该方法被调用。 设定该方法的目的是在结果返回给框架核心(framework core)之前做最后的处理, 例如设定item的ID。其接受一个结果的列表(list of results)及对应的response。 其结果必须返回一个结果的列表(list of results)(包含Item或者Request对象)。


XMLFeedSpider 示例

spider十分易用,下边是其中一个例子:

from scrapy.spiders import XMLFeedSpider
from tutorial.items import TutorialItem

class MySpider(XMLFeedSpider):
    name = 'geek-docs'
    allowed_domains = ['sina.com.cn']
    # 设置要分析的 XML 文件地址
    start_urls = ['http://blog.sina.com.cn/rss/1615888477.xml']
    iterator = 'iternodes'  # This is actually unnecessary, since it's the default value
    # 此时将开始迭代的节点设置为第一个节点 rss
    itertag = 'rss'  # change it accordingly

    def parse_node(self, response, selector):
        i = TutorialItem()
        i['title'] = selector.xpath("/rss/channel/item/title/text()").extract()
        i['link'] = selector.xpath("/rss/channel/item/link/text()").extract()
        i['author'] = selector.xpath("/rss/channel/item/author/text()").extract()
        # 通过 for 循环以遍历出提取出来的存在在 item 中的信息并输出
        for j in range(len(i['title'])):
            print("第 %s 篇文章" % str(j + 1))
            print("标题是:%s" % i['title'][j])
            print("对应链接是:%s" % i['link'][j])
            print("对应作者是:%s" % i['author'][j])
            print("-" * 20)
        return i

输出结果:
Scrapy XMLFeedSpider

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程