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
输出结果: