scrapy框架简介:

Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。

尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取),但它也可以用来访问API来提取数据。

scrapy架构图:

scrapy支持python3.6 scrapy怎么样_scrapy不足


scrapy的各个模块:

scrapy支持python3.6 scrapy怎么样_scrapy架构图_02


crapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

简单的Scrapy 爬虫只需要五步:
新建项目 :创建爬虫项目,命令:scrapy startproject xxxx
创建应用,命令:scrapy genspider spider名称 目标站点
明确字段 (编写items.py):明确你想要抓取的目标站点的字段
制作爬虫 (spiders/spider.py):编写爬虫开始爬取网页,解析网页内容
存储内容 (pipelines.py):设计管道存储爬取内容

scrapy框架评价:
scrapy框架,将网页采集的通用功能,集成到各个模块中,留出自己定义的部分,它将程序员从繁冗的流程式重复劳动中解放出来,简单的网页爬虫的重点,就集中在应对反爬,大规模爬取和高效稳定的爬取这几个方面。
优点:
1)scrapy 是异步的,可以灵活调节并发量
2)采取可读性更强的 xpath 代替正则,速度快
3)写 middleware,方便写一些统一的过滤器
4)同时在不同的 url 上爬行
5)支持 shell 方式,方便独立调试
6)通过管道的方式存入数据库,灵活,可保存为多种形式
缺点:
1)无法用它完成分布式爬取
2)自身去重效果差,消耗内存,且不能持久化
3)对于需要执行js才能获取数据的网页,爱莫能助
4)兼容了下载图片与视频,但是可用性比较差
5)自身扩展的log模块,不好用,经常需要自定义
6)基于 twisted 框架,运行中的 exception 是不会干掉 reactor(反应器),并且异步框架出错后 是不会停掉其他任务的,数据出错后难以察觉,预警系统简单的使用邮件,很不友好

scrapy抓取简单的网页很有效,但也有很多缺陷,功能并不能十分满足日常需要,所以有许多公司自行定制化开发爬虫框架,来完成对数据的采集,许多扩展件在github上也取得了不小的成绩。

scrapy的扩展件:

scrapy_redis解决分布式爬取:

scrapy支持python3.6 scrapy怎么样_scrapy支持python3.6_03


scrapy支持python3.6 scrapy怎么样_scrapy架构图_04


scrapy_redis通过redis实现调度器的队列和指纹集合,完成分布式和去重。

scrapy_redis_bloomfilter,基于Redis的Bloomfilter去重,并将其扩展到Scrapy框架,实现持久化去重,上亿或十亿级别的去重功能。

scrapy-splash ,整合了javascript,可以在scrapy当中执行js,获取数据,解析。

待爬取的目标网页站点,千奇百怪,在实际项目中,为了快速方便的实现功能,需要灵活的使用框架,比如结合requests使用,修改源码,重新定义扩展,输出日志到可视化工具系统,自定义发送钉钉预警等。