Scrapy框架(一)——初始Scrapy

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzyaiwl/article/details/88822114

Scrapy框架已经自学了大半个月了,今天开始总结下这方面的笔记。这个框架在抓取静态页面上的数据,的确是非常强大。不仅是因为其天生异步,而且里面的逻辑性也非常紧密。没事看看其源码,会使得你对python语法有更深的认识。

Scrapy简介

Scrapy是一个开源的爬虫框架,目前在Python爬虫领域基本处于一家独大的地位,只要说起Python的开源爬虫框架,那基本指的都是Scrapy。在Scrapy的官网上,则宣称的是Scrapy是一个快速、简单、容易扩展的爬虫框架。Scrapy确实是容易扩展的,通过各种管道(Pipeline)和中间件(Middleware),能够非常方便的扩展Scrapy的功能。但其实相对来说,做一些简单的、抓取量小的任务时,Scrapy是比较笨重的,这种任务更适合使用Requests去做。

而如果你抓取的数据量较大的话,使用Scrapy是非常合适的,因为底层是基于Twisted,所以Scrapy是天生异步的,就基本不用再去额外的考虑并发的问题了。同时它提供了对于爬虫来说非常全面的功能,而且扩展功能跟二次定制也很方便。配合类似于Scrapy-redis之类的库也可以很简单的实现分布式的爬虫。

安装

本人使用的Ubuntu16.04,这里介绍下在Ubuntu下的安装。scrapy安装需要依赖其他的库,为了方便库管理,我新建了一个虚拟环境,并进入输入以下指令

sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev python3-dev

依赖库安装完成后,便可以通过pip安装scrapy

pip install scrapy

基础使用

  • 新建项目

在我们要保存项目的目录下,执行下面命令来创建项目。项目名必填,项目目录默认会在当前目录下创建一个与项目名同名的目录。

scrapy startproject <项目名> [项目目录]

项目结构如下:

projectname/

    scrapy.cfg            # 部署的配置文件

    projectname/          # 项目的Python模块,导入自己代码的话需要从这里导入

      spiders/          # 一个将会存放你的爬虫的目录

            __init__.py

        __init__.py

        items.py          # 配置Item的文件

        middlewares.py    # 配置中间件的文件

        pipelines.py      # 配置管道的文件

        settings.py       # 项目的配置文件
  • 启动爬虫

scrapy项目的启动必须使用命令行,不是单纯地在pycharm上运行。命令行如下:

scrapy crawl <name>

name是项目spider目录下自定义的,具有唯一标识性,在后面会谈及。

  • 启动srapy shell

scrapy shell启动会默认加载项目,方便我们调式。推荐用pip下载个ipython,下载完成后,这个shell会默认去使用ipython。启动方式是在项目根目录下,运行下面命令:

scrapy shell <url>

上面的url可以是网址,也可以是本地文件的路径。进入shell后,还可以通过fetch(url)命令,更换url。

  • 自动创建spiders下的文件

我们自定义的文件爬虫是在spiders目录下创建,当然我们可以通过命令行来创建:

scrapy genspider [-t template] <name> <domain>

name既是文件的名字,也是类里的name属性的值。domain参数是类里start_urls属性的值。

下面我们来创建以下,输入指令如:scrapy genspider demo "https:www.baidu.com" ,这时可以发现spiders目录下多了一个demo.py文件,如下图所示:

name就是我们启动文件所使用到的属性值。allowed_domains属性是运行发送请求的域名,start_urls是最先发送的请求地址。parse方法是必须的,用于解析请求返回的response,并返回item或request对象。

运作流程

Scrapy的运作流程由各个组件一起完成,它们各自相互配合,架构清晰。下面先分别介绍各个组件的功能。

组件

  • Spider

爬虫,这个部分常常由我们自己编写,在Spider中需要定义网页抓取和解析的所有流程和规则。

  • Engine

引擎,整个爬虫系统的数据流程处理,都由Engine来进行触发 ,是Scrapy的核心。

  • Scheduler

调度器,负责维护Request的队列,将Engine传递过来的Request放入队列之中,并在Engine请求时将一个Request交给Engine

  • Item Pipeline

数据管道,负责处理在Spider中得到的Item。这个Pipeline主要用处就是清洗数据,处理数据,存储数据。

  • Downloader

下载器,根据接收到的Request,去下载相应的网页内容,并生成Response返回给Spider

  • Item

​​​​​​​数据,也就是在Spider中抓取网页并解析后,我们最终要获得的数据结果,在Scrapy中专门定义了这样一个数据结构用于保存抓取到的数据。格式和使用方式与字典类似。

  • Spider Middleware

​​​​​​​爬虫中间件,处于SpiderEngine之间。

  • Downloader Middleware

​​​​​​​下载器中间件,处于DownloaderEngine之间。

运作流程

  1. Engine首先会打开一个起始url,并找到相对应的Spider来处理这个url访问返回的响应结果。
  2. Spider的处理过程中,会将接下来要访问的url包装成Request,Engine会将Request从Spider取出,交给Scheduler进行调度。
  3. EngineScheduler获取一个Request。
  4. Engine将获取到的Request经由下载器中间件(Downloader Middleware)发送给Downloader进行下载并生成相应的Response。
  5. EngineDownloader获取一个Response。
  6. Engine将获取的Response经由爬虫中间件(Spider Middleware)发送给相对应的Spider,由Spider来对Response进行解析。在解析过程中,可能会产生两种产物,一种是Item,一种是Request。产生的Request会再次沿着步骤1的流程运行下去,而产生的Item则会进入下一步。
  7. EngineSpider获取一个Item
  8. Engine将获取的Item发送给Item Pipeline进行相对应的存储、清洗等处理。Item Pipeline处理的过程中,同样可能会生成新的Request,这时候生成的Request会直接放入Scheduler中,从步骤3再次执行下去。

下一篇笔记是Spider

 

猜你喜欢

转载自blog.csdn.net/wzyaiwl/article/details/88822114