【网络爬虫与信息提取】Scrapy爬虫框架入门

一、scrapy框架简介

scrapy和前面学的BeautifulSoup库、Re库其实都是函数功能库,但是scrapy由于有着一些固定的结构,更像是一个框架,所以称之为爬虫框架,所谓爬虫框架,指的是一个软件结构和功能组件的集合,这其实是一个半成品,完成具体实现之后,能够帮助用户实现专业的网络爬虫。

二、scrapy框架结构

scrapy的结构称为5+2结构,指的是这个框架是由五个部分加上两个中间件组成的,其结构如下图:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第1张图片
从数据的流向来看,scrapy框架有三条数据流动的线路:
①spiders-engine-scheduler
这条数据流向的关键在于engine,engine从spiders那里获得爬取的请求,再将请求转发给scheduler,用于调度。
②scheduler-engine-downloader-engine-spiders
沿着第一条数据流动,engine从scheduler那里获得下一个要爬取的请求,这里下一个要爬取的并不一定是刚刚传送过来的,这一点会在后面每个部分的功能那里展开详细说。engine获得下一个目标之后,将请求通过中间件传给downloader,爬取后形成一个response,通过中间件发送给engine,之后engine再将响应通过中间件送回给spiders处理。这条数据流动是将一个爬取请求具体实施并且返回一个response对象给spiders。
③spiders-engine-scheduler/item pipelines
这条数据流向继续沿着上一条,spiders处理响应之后,将产生的爬取项和新的爬取请求交给engine,engine将爬取项送给item pipelines或者是将新的爬取请求送给scheduler重复第一条数据流动。

整体来看,框架的入口是spiders的初试爬取请求,而出口则是最后的item pipeline,关键在于engine,engine控制各个部分,并且不间断从scheduler处获得爬取请求,直到请求为空。不难发现,其实对于整个框架,只有入口和出库是需要用户编写的,而对于中间的三个模块,几乎不需要用户去操作什么,所以中间的这三个模块就已经设计好了,如果需要修改什么配置,利用这两个中间件就可以。
【网络爬虫与信息提取】Scrapy爬虫框架入门_第2张图片

三、scrapy框架解析

上一部分看了整体的结构,这一部分展开看一下内部每个模块的具体功能。

①engine
是框架的核心部分,控制所有模块之间的数据流,根据条件触发事件,不需要用户修改,在整个框架中起着中枢的作用。
②downloader
根据请求下载网页,也不需要用户修改,在整个框架中起着干体力活的角色。
③scheduler
对爬取的请求进行管理调度,不需要用户修改,主要用于当有很多个爬取请求时,根据需要进行调度,正是这种调度,使得刚刚收到的请求不一定马上发出去,在整个框架中起着小管理者的角色。
④downloader middleware
engine和downloader之间的中间件,主要是进行engine、scheduler和downloader之间的用户可以配置的控制,需要的时候可以丢弃、修改或者增删请求和响应,用户可以修改这部分的代码来对这三个模块进行控制。
⑤spider
解析downloader返回的response对象,产生爬取项或者产生额外的爬取请求,需要用户来配置代码。这可以看作框架里的罪恶之源,一切的爬取请求都是从这里来的,这里同时会处理爬取的结果,将结果变成具体的项目再送给下一步。
⑥item pipeline
以流水线的形式处理spiders产生的爬取项,这里的操作主要包含清理、检验、查重、存储等内容,也需要用户配置代码。这里是框架的出口,在出口处根据用户的需要,对产生的爬取项目进行细分的处理。
⑦spider middleware
spiders和engine之间的中间件,主要用于对请求和爬取项的在处理,修改、丢弃、新增请求或者爬取项,也需要用户编写配置代码。

四、requests库与scrapy库的比较

request库也可以进行页面的爬取和请求,既然如此为何还要引入scrapy框架,简单来说这两者的区别就好比后端使用框架和不使用框架,在比较简单的情况下(比如本人毕设),完全可以不用框架,但是在项目比较复杂的情况下,采用框架会更加条理简单。
对于这两个库也是如此,对于复杂的网站的爬取,使用scrapy库会更合适,而简单的网页requests就足矣。当然,采用框架有时也相当于给自己加了一些条条框框,因为五个模块中三个是一成不变的,就算修改也是只能改中间件,所以深度定制的难度比较大,而requests由于比较简单,更加适合灵活地定制。
【网络爬虫与信息提取】Scrapy爬虫框架入门_第3张图片

五、scrapy的常用命令

scrapy是专门为了持续运行而设计的专业爬虫框架,一般是在控制台下启动,当然由于使用的是PyCharm,在PyCharm的控制台中一样使用:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第4张图片
scrapy常用的命令有六条,其中标红的三条是使用率更加高的:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第5张图片
注意,由于是使用在命令行里面的,所以如果想使用某个命令,要按照后面的格式来使用,这里很像Linux的命令行控制。

六、scrapy示例程序

使用scrapy时,就不像之前使用requests或者BeautifulSoup那样简单了,毕竟是大框架人家也有点面子的,需要在控制台中做一些操作。

首先在控制台中新建一个scrapy工程:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第6张图片
新建成功后,根据控制台中的信息可以直接找到对应的位置,这个位置上已经新增了一个文件夹,文件夹的名字就是我们输入的项目名称:
在这里插入图片描述
进入这个文件夹,相当于进入了这个框架,框架内部的结构如图:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第7张图片
其中scrapy.cfg文件是部署爬虫的配置文件,这个文件一般是部署程序时用的,比如说盗版网站要根据新番更新时间,自动爬取最新更新的番剧并发布在自己的盗版网站上,这种情况下就需要修改这个配置文件,通过调整端口等内容,让项目能够部署,但是对于本地运行的爬虫则不太需要这一步。
剩下的文件夹则是使用框架的用户定义的代码,打开文件夹是下面的结构:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第8张图片
里面是五个py文件和两个文件夹,下面一一介绍一下文件和文件夹的作用:
①init.py
是运行的初始化脚本,不需要用户的编写。
②items.py
对应items类的代码模板,继承自scrapy库中的item类,也不需要用户编写。
③middlewares.py
框架中中间件对应的代码模板,当用户需要使用到某些需要中间件参与的扩展功能时,就需要对这个文件下手。
④pipelines.py
框架中pipelines模块对应的代码模板
⑤setting.py
对应爬虫的配置文件,优化功能时就需要对这个文件下手。
⑥spiders文件夹
存放spiders代码模板目录,也就是说用户编写的爬虫文件都存放在这个文件夹下。
⑦pycache文件夹
存放缓存,无需修改。

创建好项目之后,需要利用框架产生一个爬虫,这里需要进入项目之后使用命令创建一个爬虫:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第9张图片
这里插一嘴,创建爬虫使用的命令是需要满足规定的,创建爬虫一方面需要在正确的路径下,另一方面需要指定爬虫的名字以及要爬取的地址,也就是指令中的后两项。创建完成后,在spiders文件夹下面也就出现了新建的爬虫:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第10张图片
打开这个文件,其实这个文件是已经写好一部分的了,我们需要的就是根据开发需要编写合适的代码:
【网络爬虫与信息提取】Scrapy爬虫框架入门_第11张图片
这里我们直接将网课中的代码放在这里,这段代码的作用是访问给出的网站,并且将文件以原来的名字保存在本地,同时输出控制信息。

# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):
    name = "demo"
    #allowed_domains = ["python123.io"]
    start_urls = ['https://python123.io/ws/demo.html']
    def parse(self, response):
        fname = response.url.split('/')[-1]
        with open(fname, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s.' % fname)

这样使用指令运行整个项目,爬完以后在当前路径下产生一个html文件,这个文件就是爬下来的文件。
当然这只是一个简单的示例,对于完整的项目,除了创建工程以及编写spider,还有编写ITEM、编写Pipeline以及优化配置策略等步骤。

你可能感兴趣的:(Python网络课程,爬虫,scrapy,python)