Scrapy开发指南
一、Scrapy简介
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
组件
Scrapy Engine
引擎负责控制数据流。
调度器(Scheduler)
调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
下载器(Downloader)
下载器负责获取页面数据并提供给引擎,而后提供给spider。
Spiders
Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
Item Pipeline
Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。
下载器中间件(Downloader middlewares)
下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。
Spider中间件(Spider middlewares)
Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。
二、Scrapy环境配置
安装以下程序
- Python 2.7
- Python Package: pip and setuptools. 现在 pip 依赖 setuptools ,如果未安装,则会自动安装setuptools 。
- lxml. 大多数Linux发行版自带了lxml。如果缺失,请查看http://lxml.de/installation.html
- OpenSSL. 除了Windows(请查看 平台安装指南)之外的系统都已经提供。
pip install pyopenssl
- Visual C++2008
- 安装PyWin32
- pip install scrapy
创建工程模板
命令行执行:scrapy startproject 工程名
创建好的工程结构如下图:
Idea中配置scrapy启动
二、常用API说明
开发中主要涉及spider,item,Pipeline,settings模块的开发。需要扩展插件则开发extions模块。
Spider类
继承scrapy.Spider类
属性
name : 爬虫名字,用于区别spider,唯一。
start_urls : Spider在启动时进行爬取的url列表。后续的URL则从初始的URL获取到的数据中提取。
方法
parse(self, response) :每个初始url爬取到的数据将通过response参数传递过来。此方法负责解析数据(response), 提取数据(生成Item),生成需要进一步处理的URL请求(request)。
scrapy.Request(url=link, errback=self.errback_http, callback=self.parse_article)
框架会对url=link的地址发起请求,如果请求出现错误执行用户自定义的errback_http方法,如果请求成功则执行用户自定义的parse_article方法。
Item类
需要继承scrapy.Item。Item是一个dict(),用于存储spider中parse()中解析到的数据,在pipeline中调用。
import scrapy class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
Scrapy Selector基于xpath和css提取元素。
xpath()
: 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。css()
: 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.extract()
: 序列化该节点为unicode字符串并返回list。re()
: 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。
运行爬虫
在项目目录下运行以下命令,即可执行爬虫:
scrapy crawl NAME(爬虫名字)
配置文件Settings
Settings文件可以可以控制包括核心(core),插件(extension),pipeline及spider组件。这里只说3.settings模块。
- 命令行选项(Command line Options)(最高优先级)
- 每个spider的设定
- 项目设定模块(Project settings module)
- 命令默认设定模块(Default settings per-command)
- 全局默认设定(Default global settings) (最低优先级)
访问settings
如果需要使用该配置文件中定义的属性,类(爬虫,管道,插件)需要增加额外的类方法: from_crawler(cls, crawler)。
设定可以通过Crawler的 scrapy.crawler.Crawler.settings
属性进行访问。其由插件及中间件的from_crawler
方法所传入:
class MyExtension(object): @classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
if settings['LOG_ENABLED']:
print "log is enabled!"
也可以通过字典访问,避免错误,建议使用setting API中的规范key值。
管道开发
管道类似过滤处理链,根据自定义业务依次处理Spider解析后的数据,例如数据验证(去重、转换),计算存储(DB,NOSQL),发送消息(Kafka,MQ),报表生成。
开发自定义管道类需要两步骤:
- 在pipelines中定义类并实现 process_item(self, item, spider) 方法, 其中item对象为spider解析后待处理的数据。
- 在settings中开启管道配置信息,ITEM_PIPELINES 中配置自定义管道类名和执行序列。
说明
自定义管道根据序列号从小到大依次执行请求,如果抛出DropItem异常,后续管道将不会执行,例如数据出现重复主键,可以抛出DropItem异常。
日志开发
使用以下代码在管道中定义日志名称
logger = logging.getLogger('pipelogger')
同时可以在包初始化文件__init__.py中定义日志级别 : LOG_LEVEL = 'INFO'
日志启用也可以在settings中设置如下属性
LOG_ENABLED = True #启用日志
LOG_ENCODING = 'utf-8' #设置日志字符集
LOG_FILE = 'e://workspace/log/csdncrawl.log' #指定日志文件及路径
LOG_LEVEL = 'INFO' #定义日志级别
LOG_STDOUT = True #是否将print语句打印内容输出到日志
扩展插件
开发者可自定义运行在不同阶段的插件,例如打开爬虫、关闭爬虫、数据抓取等。
插件只需要关注:在什么时候做什么事情,即 状态-方法。
开发插件只需要2步:
- 开发插件类,可定义在extensions.py文件中,在from_crawler中增加状态-方法的映射关系,例如在打开爬虫的时候执行spider_opened方法可这样配置:
crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)
- 在settings中配置插件类,和管道定义类似, 其KEY为EXTENSIONS
四、代码示例
Spider示例
import scrapy class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
] def parse(self, response):
for sel in response.xpath('//ul/li'):
title = sel.xpath('a/text()').extract()
link = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
print title, link, desc
日志Logging
import logginglogger = logging.getLogger('mycustomlogger')
logger.warning("This is a warning") import logging
import scrapy logger = logging.getLogger('mycustomlogger') class MySpider(scrapy.Spider): name = 'myspider'
start_urls = ['http://scrapinghub.com'] def parse(self, response):
logger.info('Parse function called on %s', response.url)
参考资料:
中文版scrapy资料地址:https://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/tutorial.html
Scrapy开发指南的更多相关文章
- ASP.NET Aries 开源开发框架:开发指南(一)
前言: 上周开源了Aries开发框架后,好多朋友都Download了源码,在运行过程里,有一些共性的问题会问到. 所以本篇打算写一下简单的开发指南,照顾一下不是太看的懂源码的同学,同时也会讲解一下框架 ...
- FreeMarker模板开发指南知识点梳理
freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生 ...
- Jetty使用教程(四:21-22)—Jetty开发指南
二十一.嵌入式开发 21.1 Jetty嵌入式开发HelloWorld 本章节将提供一些教程,通过Jetty API快速开发嵌入式代码 21.1.1 下载Jetty的jar包 Jetty目前已经把所有 ...
- JVM 平台上的各种语言的开发指南
JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...
- iOS原生地图开发指南续——大头针与自定义标注
iOS原生地图开发指南续——大头针与自定义标注 出自:http://www.sxt.cn/info-6042-u-7372.html 在上一篇博客中http://my.oschina.net/u/23 ...
- Angularjs中文版本开发指南发布
从本人开始在写关于Angularjs的文章开始,也算是见证了Angularjs在国内慢慢的火起来,如今的Angularjs正式如日中天.想知道为什么Angularjs会这么火,请移步angularjs ...
- nodejs开发指南读后感
nodejs开发指南读后感 阅读目录 使用nodejs创建http服务器; supervisor的使用及nodejs常见的调式代码命令了解; 了解Node核心模块; ejs模板引擎 Express 理 ...
- Libgdx 开发指南——目录
本系列文档选译自libgdx github项目 wiki : https://github.com/libgdx/libgdx/wiki 由于关于Libgdx的中文文档非常稀缺,因此在这里对官方Wik ...
- jQuery MiniUI 开发指南+API组件参考手册
jQuery MiniUI 开发指南 本文档将逐步的讲解jQuery MiniUI的方方面面,从此您将踏上jQuery MiniUI的深入探索之旅. 1.Hello M ...
随机推荐
- 著名ERP厂商的SSO单点登录解决方案介绍一
SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- NDK开发_笔记0
自谷歌搜索退出中国以来,谷歌对全球第二大市场中国的态度一直保持冷淡.可是北京时间12月8日,谷歌2016开发者大会在北京召开,同时专门针对中国的谷歌开发者网站已经上线:https://develope ...
- jQuery 的选择器常用的元素查找方法
jQuery 的选择器常用的元素查找方法 基本选择器: $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myE ...
- java 泛型
1.Student stu =tool.getObj();右边得到的是Object类型,需要向下转型,强转换. 2. 3. 4.泛型方法不能被静态修饰这样写 5.如果想定义定义静态泛型方法,只能这样写 ...
- 简单的转盘抽奖——CSS动画优化
前言 前两天去一家公司面试,被问到一些小游戏的东西.面试官提到了刷红包还有抽奖这些怎么实现,当时简单说了下思路,回来之后想想还是说的太轻描淡写了,干说不做就是耍流氓,所以就做了一个(Demo & ...
- Jvm --- 常用工具
jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...
- 解决VMWARE NAT SERVICE服务无法启动或服务消失的问题
解决VMWARE NAT SERVICE服务无法启动或服务消失的问题 2016-02-02 11:18 2012人阅读 评论(2) 收藏 举报 分类: 网络通信(3) 今日使用VMware中的Wi ...
- Hibernate 命名查询
1.定义 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式被称为命名查询. 2.创建表结构并添加测试数据 create table `student` ( `id` dou ...
- 【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想学习片段着色器(Fragment Shader). 你想实现 ...