Scrapy框架

Scrapy框架介绍

  • Scrapy框架是一个基于Twisted框架开发而来,Twisted是一个流行的事件驱动的Python网络框架,所有Scrapy框架使用了一种非阻塞(又名异步)的代码来实现并发。
  • 是纯Python实现的爬虫框架,它的结构清晰,模块之间的耦合程度低,可扩展性极强,可以灵活的完成各种需求。使用框架我们只需要定制开发几个模块就可以轻松实现一个爬虫。

scrapy框架结构及工作原理

Scrapy框架可以分为以下几个部分:

    • Scrapy Engine(Scrapy引擎):引擎是整个框架的核心,其它所有的组件都是在它的控制下协同工作的。
    • Scheduler(调度器):调度器是负责对Spider提交的下载请求进行调度的。
    • Dowbloader(下载器):下载器是负责下载页面(发送HTTP请求/接收HTTP响应)。
    • Spider(爬虫):爬虫程序负责提取页面中的数据,并产生对新页面的下载请求。
    • Item Pipeline(项目管道):项目管道也可以叫数据管道,是负责对爬取到的数据进行处理。
    • Downloader Middlewares(下载器中间件):它是下载器中间件,介于Scrapy引擎与下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的Requests请求和Response响应,它提供了一个自定义的代码的方式来拓展Scrapy框架的功能,它是一个轻量级的,对Scrapy有全局操控的底层系统。
    • Spider Middlewares(蜘蛛中间件):它是介于Scrapy引擎和Spider之间的钩子框架,主要是处理Spider的响应输入和请求输出。蜘蛛中间件是一个挂接到Scrapy的爬虫处理机制的框架,可以插入自定义的代码来处理发送给Spider的请求和返回响应。
    • Scheduler Middlewares(调度中间件):它是介于Scrapy引擎和调度器之间的中间件,主要工作是处理从Scrapy引擎发送给调度器的请求和响应。

Scrapy框架流程图:

Scrapy框架的工作原理:

  1. 引擎打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取的url。
  2. 引擎从Spider中获取到第一个要爬取的url并在调度器Scheduler以Requests调度。
  3. 引擎向调度器请求下一个要爬取的url。
  4. 调度器返回一个要爬取的url给引擎,引擎将url通过下载器中间件(请求Requests方向)转发给下载器(Downloader)下载响应的数据内容。
  5. 一旦内容下载完毕之后,下载器生成一个该页面的Response对象,并将其通过下载器中间件(返回Response方向)发送给引擎。
  6. 引擎从下载器中接收到Response对象并通过Spider中间件(输入方向)发送给Spider处理提取数据。
  7. Spider处理Response并返回爬取到的Item及新的Requests给引擎。
  8. 引擎再将Spider返回的Item给Item Pipeline,并且将Spider返回的Requests给调度器。
  9. 再次从第二部直到调度器中没有更多的Requests请求,引擎关闭该网站。
  10. 再由Item Pipeline处理Spider中获取的数据进行后期处理(过滤,存储等)操作。

Scrapy框架的创建、运行

  1. 创建项目命令:scrapy startproject 项目名称
  2. 创建爬虫:scrapy genspider 爬虫名  爬虫的地址
  3. 运行爬虫:scrapy crawl 爬虫名

Scrapy框架的评价

Scrapy框架,将网页采集的通用功能集中到各个模块中,流出自己定义的部分,它将程序员从繁冗的流程式重复劳动中解放了出来,简单的网页爬虫的重点就集中在应对爬虫,大规模的爬取和高效稳定的爬取这几个方面。

优点:

  1.  Scrapy框架效率高、异步、非阻塞,可以灵活的调节并发量。
  2. 采取可读性更强的Xpath替代正则,速度快。
  3. 写Middleware,方便写一些统一的过滤器。
  4. 强大的统计和Log系统,同时在不同的url上爬行
  5. 支持Shell方式,方便独立调试。
  6. 通过管道的方式存入数据库,灵活,可保存为多种形式。

缺点:

  1. 基于Python爬虫框架,扩展性比较差,无法用它完成分布式爬取。
  2. 基于Twisted框架,运行Exception是不会干掉Reactor,并且异步框架出错后是不会停掉其它任务,数据出错后难以察觉。

Scrapy的扩展件:可以使用Scrapy_redis解决分布式爬取

  1. Scrapy_redis通过Redis实现调度器的队列和指纹集合,完成分布式和去重。
  2. Scrapy_redis_bloomfilter,基于Redis的Bloomfiter去重,并将其扩展到Scrapy框架,实现持久化去重,上亿或十亿级别的去重功能。
  3. Scrapy-splash,整合了了Javascript,可以在Scrapy当中执行js,获取数据和解析

posted @ 2020-09-09 15:57  程序猿老高  阅读(214)  评论(0)    收藏  举报