---恢复内容开始---
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
引擎负责控制数据流。
调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
下载器负责获取页面数据并提供给引擎,而后提供给spider。
Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。
下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。
Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。
Scrapy框架提供可扩展的网页爬取技术方案,开发者只需要遵循接口规范即可开发出定制化的爬虫。
爬虫Class定义需要放在spiders目录下。
属性
name : 爬虫名字(必有)
start_urls : 爬取起始网址(必有)
方法
parse(self, response) :获取网页内容后框架执行的回调方法,在该方法中可以对响应进行处理,也可以再次发起Request请求,例如:
scrapy.Request(url=link, errback=self.errback_http, callback=self.parse_article)
框架会对url=link的地址发起请求,如果请求出现错误执行用户自定义的errback_http方法,如果请求成功则执行用户自定义的parse_article方法。
元素抽取运行爬虫
在项目目录下运行以下命令,即可执行爬虫:
scrapy crawl NAME
其中NAME为爬虫属性name
自定义元素(Item)在items.py中定义,需要继承scrapy.Item,可以将元素理解成key-value的HashMap。
Spider代码尽可能关注内容抽取,并保存在Item中,后续框架将Item交给管道处理,这种方式很好地对数据抽取和处理进行解耦。
例如上述的 parse_article 方法, API要求返回一个元素或字典类型对象,在管道中可获取该对象并进行数据处理。
配置信息都定义在settings中,可以把它理解成Java应用中的application.properties文件,数据库,缓存等信息都保存在这里。
如果需要使用该配置文件中定义的属性,类(爬虫,管道,插件)需要增加额外的类方法: from_crawler(cls, crawler)
框架在实例化类对象时候回调该方法,并传入crawler对象,后者可以获取到定义在settings中的属性值,例如:
crawler.settings.get(‘URL_FILE‘)
settings中的属性也可以通过在代码中引入from scrapy.utils.project import get_project_settings,显示的调用
settings = get_project_settings()方法然后就可以使用settings中的属性值了。如下:
conn = MySQLdb.connect(
host=settings[‘MYSQL_HOST‘],
user=settings[‘MYSQL_USER‘],
passwd=settings[‘MYSQL_PASSWD‘],
db=settings[‘MYSQL_DBNAME‘],
use_unicode=True,
charset="utf8"
)
管道类似过滤处理链,根据自定义业务依次处理Spider解析后的数据,例如数据验证(去重、转换),计算存储(DB,NOSQL),发送消息(Kafka,MQ),报表生成。
开发自定义管道类需要两步骤:
说明
自定义管道根据序列号从小到大依次执行请求,如果抛出DropItem异常,后续管道将不会执行,例如数据出现重复主键,可以抛出DropItem异常。
使用以下代码在管道中定义日志名称
logger = logging.getLogger(‘pipelogger‘)
日志启用也可以在settings中设置如下属性
LOG_ENABLED = True #启用日志
LOG_ENCODING = ‘utf-8‘ #设置日志字符集
LOG_FILE = ‘e://workspace/log/csdncrawl.log‘ #指定日志文件及路径
LOG_LEVEL = ‘INFO‘ #定义日志级别
LOG_STDOUT = True #是否将print语句打印内容输出到日志
开发者可自定义运行在不同阶段的插件,例如打开爬虫、关闭爬虫、数据抓取等。
插件只需要关注:在什么时候做什么事情,即 状态-方法。
开发插件只需要2步:
crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)
DEMO示例为爬取网易体育新闻下的头条新闻,将url写到urls.txt文件中并对url进行去重处理,将标题、来源写到datas.txt文件中,通过插件统计爬取总数。
源代码参考附件:
---恢复内容结束---
原文:http://www.cnblogs.com/qabetter/p/6238797.html