XMLFeedSpider
XMLFeedSpider被设计用于通过迭代各个节点来分析XML源(XML feed)。 迭代器可以从 iternodes , xml , html 选择。 鉴于 xml 以及 html 迭代器需要先读取所有DOM再分析而引起的性能问题, 一般还是推荐使用 iternodes 。 不过使用 html 作为迭代器能有效应对错误的XML。
你必须定义下列类属性来设置迭代器以及标签名:
1、iterator
用于确定使用哪个迭代器的string。可选项有:
- iternodes 一个高性能的基于正则表达式的迭代器。
- html 使用selector的迭代器。需要注意的是该迭代器使用DOM进行分析,其需要将所有的DOM载入内存。
- xml 使用selector的迭代器。需要注意的是该迭代器使用DOM进行分析,其需要将所有的DOM载入内存。
默认值为iternodes。
2、itertag
一个包含开始迭代的节点名的string。例如:1
itertag='product'
3、namespaces
一个由(prefix,url)元组所组成的list。其定义了在该文档中会被spider处理的可用的namespace。prefix及url会被自动调用register_namespace()生成namespace。
你可以通过在itertag属性中制定节点的namespace。
例如:1
2
3
4
5class YourSpider(XMLFeedSpider):
namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]
itertag = 'n:url'
# ...
除了这些新的属性之外,该spider也有以下可以覆盖的方法:
1、adapt_response(response)
该方法在spider分析response前被调用。你可以在response被分析之前使用该函数来修改内容(body)。该方法接受一个response并返回一个response(可以相同也可以不同)。
2、parse_node(response,selector)
当节点符合提供的标签名时(itertag)该方法被调用。接收到的response以及相应的selector作为参数传递给该方法。该方法返回一个Iten对象或者Request对象或者一个包含二者得可迭代对象(iterable)。
3、process_results(response,results)
当spider返回结果(item或request)时该方法被调用。设定该方法的目的是在结果返回给框架核心(framework core)之前做最后的处理,例如设定item的ID。其接受一个结果的列表及对应的response。其结果必须返回一个结果的列表包含item或者request的对象)。
XMLFeedSpider例子
1 | from scrapy import log |
简单来说,我们在这里创建了一个spider,从给定的 start_urls 中下载feed, 并迭代feed中每个 item 标签,输出,并在 Item 中存储有些随机数据。
这个spider就是可以具体返回到某个节点的所有selector。然后你处理的时候有两种选择,一种是根据原始response进行筛选,另一种就是根据你定义的itertag继续往下筛选。减少了表达式。