Python爬虫初级(十四)—— Scrapy爬虫基础

欢迎关注公众号K的笔记阅读博主更多优质学习内容
K的笔记公众号
Scrapy库不是一个简单的函数,而是一个爬虫框架。爬虫框架就是实现爬虫功能的一个软件结构和功能组件集合爬虫框架就是一个半成品,能够帮助用户实现专业网络爬虫。

Scrapy爬虫框架结构

“5+2”结构

  • Engine模块
  • Spider模块
  • Downloader模块
  • ItemPipelines模块
  • Scheduler模块

另外在Engine和Spider模块之间,以及Engine和Downloader模块之间包含了两个MiddleWare模块这个结构就称为Scrapy爬虫框架。在Scrapy框架中,数据包括用户提交的网络爬虫请求,以及从网络上提取地相关内容,在这些结构之间进行流动,形成数据流。

Scrapy框架主要包含三条主要的数据流路径

  • 第一条从Spiders经过Engine到达Scheduler,Engine从Spiders处获得用户的请求(Requests),可以简单地认为是一个URL,请求到达Engine后,Engine将其分配给Scheduler模块,而Scheduler模块负责对爬取请求进行调度。

  • Scrapy的第二条数据流路径是从Scheduler模块通过Engine模块到达Downloader模块,并且最终返回Spider模块。首先Engine模块从Scheduler模块获取下一个要爬取的网络请求,这一个网络请求是真实的要到网络上进行爬取的请求,Engine获得这个请求后通过中间键发送给Downloader模块,Downloader模块和获取请求之后真实地连接互联网并且爬取相关网页,爬取到网页后Downloader模块形成响应(Response),将所有内容封装为Response后打包通过Engine中间键发送给Spiders。在这条路径中一个真实地爬取URL的请求经过Scheduler,Downloader最终返回了相关内容返回Spiders。

  • 第三条数据流路径是从 Spiders模块经过Engine模块到达ItemPipelines模块以及Scheduler模块。首先Spiders处理从Downloader获得的响应(从网络中爬取的相关内容),得到两个数据类型,一个数据类型叫爬取项(Scrapy Item),另一个数据类型是新的爬取请求。也就是我们从网络上获得一个网页之后,如果网页中有我们感兴趣的链接,我们可以在Spiders中增加相关的功能,对新的链接发起再次的爬取。Spiders生成了这两个数据类型之后,将它们发送给Engine模块,Engine随后将Item发送给ItemPipelines,将Requests发送给Requests进行调度,从而为后期的数据处理以及再获取网络爬虫请求提供了相应的数据来源。

在这条路径中,Engine控制着各个模块的数据流,并且它不断地从Scheduler获取真正要爬取的请求并发送给Downloader。这个框架的入口是Spiders,出口是ItemPipelines。在这个“5+2”结构中,Engine,Scheduler和Downloader都已有实现,用户不需要去编写他们,他们会按照既定的功能 完成相关的任务。用户需要编写的是Spiders模块和Item Pipelines模块,其中Spiders模块向整个Scrapy模块提供访问URL链接,同时解析从网络上获得的页面内容,ItemPipeline模块负责对提取的信息进行后处理。由于在这个框架下,用户只需要编写部分代码,因此这个过程也被称为配置,用户只需要在这个框架下进行简单的配置即可完成爬取需求。

Downloader Middleware目的是实施Engine、Scheduler、Downloader之间进行用户可配置的控制,功能是修改、丢弃、新增请求或响应。Spider Middleware目的是对请求和爬取项进行再处理,功能是修改、丢弃、新增请求或爬取项。

Requests库和Scrapy爬虫的比较

相同点

  1. 两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
  2. 两者可用性都好,文档丰富,入门简单
  3. 两者都没有处理js、提交表单、用对验证码功能(可扩展)

不同点

requestsScrapy
页面级爬虫网站级爬虫
功能库框架
并发性考虑不足,性能较差并发性好,性能较高
重点在于页面下载重点在于爬虫结构
定制灵活一般定制灵活,深度定制困难
上手简单入门稍难

具体选择:

  • 非常小的请求:Requests库
  • 不太小的请求:Scrapy框架
  • 定制成都很高的请求,自搭框架:Requests库

Scarpy爬虫的常用命令

  • Scrapy命令行的启用——直接在命令行输入:scrapy -h
  • 命令格式:scarpy <command> [options] [args],Scrapy的命令在command体现

常用命令如下:

命令说明格式
startproject创建一个工程scrapy startproject <name>[dir]
genspider创建一个爬虫scrapy genspider [options] <name><domain>
settings获得爬虫配置信息scrapy settings [options]
crawl运行一个爬虫scrapy crawl <spider>
list列出工程中所有爬虫scrapy list
shell启动URL调试命令行scrapy shell [url]

为什么Scrapy采用命令行创建和运行爬虫?

  • 命令行(不是图形界面)更容易自动化,适合脚本控制(只有用户才会关注图形界面)

Scrapy爬虫第一个实例

首先我们有Scrapy爬虫的产生步骤:

  1. 建立一个Scrapy爬虫工程
  2. 在工程中产生一个Scrapy爬虫
  3. 配置产生的spider爬虫
  4. 运行爬虫,获取网页

建立一个Scrapy爬虫工程

演示HTML页面地址:http://python123.io/ws/demo.html

文件名称:demo.html

我们建立工程的所有的操作如下:

在这里插入图片描述

在这里插入图片描述

我们可以看到整个文件的架构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mecdepS2-1591115592493)(./Pic/Spider/Scrapy_Start.jpg)]

在生成的工程目录spider/下,含有Spiders代码模板目录(继承类),内部含有两个文件:

在这里插入图片描述

其中 _init_.py是初始文件,无需修改;而__pycache__是我们熟悉的缓存目录,也无需修改

在工程中产生一个Scrapy爬虫

我们在工作目录下先输入scrapy genspider demo python123.io命令,然后将会在python123demo文件夹下的spiders文件夹中产生一个新的文件:demo.py,具体操作如下:

在这里插入图片描述

这条命令的作用仅是生成demo.py,demo.py文件内容如下:

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

class DemoSpider(scrapy.Spider):
    name = 'demo'
    allowed_domains = ['python123.io']
    start_urls = ['http://python123.io/']

    def parse(self, response):
        pass

这个类函数DemoSpider必须是继承scrapy.Spider,name指的是这个爬虫的名字,allowed_domains是用户提交给命令行的域名,也就是爬虫在爬取网站时,只能爬取该域名下的链接,start_urls就是scrapy爬取框架爬取的初始页面。parse函数是解析页面的空的类的方法,用于处理响应,可以解析从网络中爬取内容,形成字典类型,同时从网页中发现新的要爬取的内容,生成url。

配置产生的spider爬虫

我们对parse的要求是将返回的html存成文件,下面直接看这部分代码:

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


class DemoSpider(scrapy.Spider):
    name = 'demo'
    # allowed_domains = ['python123.io']
    start_urls = ['http://python123.io/ws/demo.html']

    def parse(self, response):
        # 从响应的url中提取名字作为本地文件名
        fname = response.url.split('/')[-1]
        # 将返回内容保存为文件
        with open(fname, "wb") as f:
            f.write(response.body)
        self.log("Saved file %s." %name)

运行爬虫,获取网页

我们在命令行下执行crawl命令获取网页:

在这里插入图片描述

捕获的文件存在python123demo路径下的demo.html文件中

事实上,官方给出的更标准的写法是下面这个:

在这里插入图片描述

这里主要使用了yield,这个函数当返回的URL列表很大时,能够极大地节省存储空间,若有需要进一步了解yield的用法可自行看文档。

Scrapy爬虫的使用步骤

下面我们对爬虫使用步骤做个总结:

  1. 创建一个工程和Spider模板
  2. 编写Item Pipeline
  3. 编写Spider
  4. 优化策略配置

Scrapy爬虫的数据类型有:

  1. Requests类
  2. Response类
  3. Item类

Request对象表示一个HTTP请求,由Spider生成,由Downloader执行。具体来说Request类包含六个属性方法:

属性或方法说明
.urlRequest对应的请求URL地址
.method对应的请求方法,‘GET’'POST’等
.headers字典类型风格请求头
.body请求内容主体,字符串类型
.meta用户添加的扩展信息,在Scrapy内部模块间传递信息使用
.copy()复制该请求

Response对象表示一个HTTP响应,由Downloader生成,由Spider处理。包含了七个主要的属性和方法:

属性或方法说明
.urlResponse对应的响应URL地址
.statusHTTP状态码,默认是200
.headersResponse对应的头部信息
.bodyResponse对应的内容信息,字符串类型
.flags一组标记
.request产生Response类型对应的Request对象
.copy()复制该响应

Item对象表示一个从HTML页面中提取的信息内容,由Spider生成,由Item Pipeline处理。Item类似字典类型,可以按照字典类型操作

Scrapy爬虫提取信息的方法
Scrapy支持多种HTML信息提取的方法:Beautiful Soup,lxml,re,XPATH Selector,CSS Selector等

本文图片上传有些问题,若想获得更好的观看体验以及了解更完整的爬虫框架,欢迎 访问我的个人博客主页 chenk.tech ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值