Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
在之前的博文Scrapy常用工具命令
中讲到,可以使用scrapy genspider -l
来查看Scrapy当前可用的爬虫模板,并且已知现在可用的爬虫模板有basic
、xmlfeed
、csvfeed
和crawl
。在之前的博文中,所有有关爬虫的例子都使用basic
模板,这里将不再作介绍,下面将着重介绍其他三种爬虫模板的使用。
使用XMLFeedSpider来分析XML源
如果想用Scrapy爬虫来处理XML文件,我们可以用XMLFeedSpider来实现。现在有这样一个XML的数据源:http://www.people.com.cn/rss/politics.xml
,假如,我们想提取XML文件中的各文章的标题,作者以及发布日期等信息,首先我们在原来的项目上创建一个xmlfeed
为模板的爬虫:
scrapy genspider peoplespider -t xmlfeed www.people.com.cn
执行完上面的命令,会发现在原来的spiders
目录下多了一个peoplespider.py
的爬虫文件。用编辑器打开该爬虫文件,有如下内容:
# -*- coding: utf-8 -*-
from scrapy.spiders import XMLFeedSpider
class PeoplespiderSpider(XMLFeedSpider):
name = 'peoplespider'
allowed_domains = ['www.people.com.cn']
start_urls = ['http://www.people.com.cn/feed.xml']
iterator = 'iternodes' # you can change this; see the docs
itertag = 'item' # change it accordingly
def parse_node(self, response, selector):
i = {
}
#i['url'] = selector.select('url').extract()
#i['name'] = selector.select('name').extract()
#i['description'] = selector.select('description').extract()
return i
首先我们需要理解一下上述代码,关于name
、allowed_domains
和start_urls
属性在之前的博文中已有讲到,具体作用情况请查看上一篇博文。下面主要讲讲iterator
、itertag
和parse_node()
属性或方法的使用:
iterator
: 该属性设置的是使用哪个迭代器,默认值为iternodes
,这是一个基于正则表达式的高性能迭代器,除了这个默认值以外,还可以设置为html
或xml
itertag
: 该属性主要用来设置开始迭代的节点parse_node()
: 该方法在节点与所提供的标签名相符合的时候会被调用,在该方法中,可以进行一些信息的提取和处理的操作
除此之外,XMLFeedSpider还有一些常见的属性和方法,如下所示:
名称 | 属性或方法 | 含义 |
---|---|---|
namespaces | 属性 | 以列表的形式存在,主要定义在文档中会被爬虫处理的可用命名空间 |
adpt_response(response) | 方法 | 该方法主要在spider分析响应前被调用 |
process_results(response, results) | 方法 | 该方法主要在spider返回结果时被调用,主要对结果在返回前进行最后处理 |
随后,我们再创建一个属于peoplespider
爬虫的items文件people_items.py
,定义要存储的结构化数据,具体代码如下:
import scrapy
class PeopleItems(scrapy.Item):
title = scrapy