腊月的季节

scrapy爬虫技术六

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
5
class 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from scrapy import log
from scrapy.contrib.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):
log.msg('Hi, this is a <%s> node!: %s' % (self.itertag, ''.join(node.extract())))

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

简单来说,我们在这里创建了一个spider,从给定的 start_urls 中下载feed, 并迭代feed中每个 item 标签,输出,并在 Item 中存储有些随机数据。
这个spider就是可以具体返回到某个节点的所有selector。然后你处理的时候有两种选择,一种是根据原始response进行筛选,另一种就是根据你定义的itertag继续往下筛选。减少了表达式。

热评文章