[华为云在线课程][Python网络爬虫][Scrapy框架介绍][七][学习笔记]

举报
John2021 发表于 2022/06/19 05:52:58 2022/06/19
【摘要】 1.爬虫框架介绍 1.1.框架的概念框架是为了为解决一类问题而开发的程序,框架两个字可以分开理解,框:表示制定解决问题的边界,明确要解决的问题;架:表达的是能够提供一定的支撑性和可扩展性;从而实现解决这类问题达到快速开发的目的。框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的API可以省去很多代码编写,从而提高工作效率和开发速度。 1.2....

1.爬虫框架介绍

1.1.框架的概念

  • 框架是为了为解决一类问题而开发的程序,框架两个字可以分开理解,框:表示制定解决问题的边界,明确要解决的问题;架:表达的是能够提供一定的支撑性和可扩展性;从而实现解决这类问题达到快速开发的目的。
  • 框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的API可以省去很多代码编写,从而提高工作效率和开发速度。

1.2.为什么爬虫需要使用框架

  • 在Python所编写的爬虫程序中,我们可以使用之前介绍的HTTP请求库来完成90%的爬虫需求。但是,由于一些其他的因素,比如爬取效率低、所需数据量非常大和开发效率等,所以我们会使用到一些框架来满足这些需求。
  • 由于框架中封装了一些通用的工具,可以节省开发者的时间,增加开发效率。

1.3.Scrapy

  • Scrapy是Python开发的一个快速、高层次的web数据抓取框架,用于抓取web站点并从页面中提取结构化的数据。
  • Scrapy使用了Twisted异步网络框架,可以加快我们的下载速度。只需要少量的代码,就能够实现数据快速的抓取。

1.4.Scrapy-Redis

  • Redis:是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
  • Scrapy-Redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。通过Scrapy-Redis可以快速地实现简单分布式爬虫程序,该组件本质上提供了三大功能:
    • scheduler,调度器
    • dupefilter,URL去重规则
    • item pipeline,数据持久化

1.5.PySpider

  • PySpider是一个简单易用且强大的Python主流爬虫框架。
  • PySprider带有强大的WebUI、脚本编辑器、任务监控器、项目管理器以及结果处理器,它支持多种数据库后端、多种消息队列、JavaScript渲染页面的爬取,使用起来非常方便。
  • PySprider的可扩展程度不足,可配置化程度不高。

2.Scrapy框架

2.1.爬虫工作流程

2.2.Scrapy架构

2.3.异步非阻塞

  • 异步:调用在发出之后,这个调用就直接返回,不管有无结果;异步是过程。
  • 非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程。

2.4.Scrapy组件

  • 引擎(Engine):用来处理整个系统的数据流处理,触发事务(框架核心)。
  • 调度器(Scheduler):用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。可以想象成一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址。
  • 下载器(Downloader):用于下载网页内容,并将网页内容返回给spider(Scrapy下载器是建立在Twisted这个高效的异步模型上的)。
  • 爬虫(Spiders):spider是爬虫程序主体,用于从特定的网页中提取自己需要的信息,即所谓的实体(item)。用户也可以从中提取链接,让Scrapy继续抓取下一个页面。
  • 管道(Pipeline):负责处理爬虫从网页中提取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件(Downloader Middlewares):位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares):介于Scrapy引擎和爬虫之间的组件,主要工作是处理spider的响应输入和请求输出。
  • 调度中间件(Scheduler Middlewares):介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

2.5.创建Scrapy工程

  • 创建Scrapy项目的命令:scrapy startproject + <项目名字>
    • scrapy startproject MySprider
  • 工程结构

2.6.项目解析 - scrapy.cfg

  • scrapy.cfg:Scrapy的项目配置文件,其内定义了项目的配置文件路径、部署相关信息等内容。
    • settings:项目中的全局配置文件。
    • deploy:项目部署配置。

2.7.项目解析 - middlewares

  • middlewares.py:可以分为爬虫中间件和下载中间件。
    • MyspiderSpiderMiddleware:爬虫中间件是可以自定义requests请求和进行response过滤,一般不需要手写。
    • MyspiderDownloaderMiddleware可以自定义的下载扩展,比如设置代理等。

2.8.项目解析 - settings

  • settings.py:项目的全局配置文件。
  • 常用字段:
    • USER_AGENT:设置user-agent参数(默认未开启)。
    • ROBOTSTXT_OBEY:是否遵守robots协议,默认是遵守(默认开启)。
    • CONCURRENT_REQUESTS:设置并发请求的数量(默认是16个)。
    • DOWNLOAD_DELAY:下载延迟(默认无延迟)。
    • COOKIES_ENABLED:是否开启cookie,即每次请求带上前一次的cookie(默认是开启)。
    • DEFAULT_REQUEST_HEADERS:设置默认请求头(默认未设置)。
    • SPIDER_MIDDLERWARES:爬虫中间件,设置过程和管道相同(默认未开启)
    • DOWNLOADER_MIDDLEWARES:下载中间件(默认未开启)。
    • ITEM_PIPELINES:开启管道。

2.9.项目解析 - items,pipelines

  • items.py:定义item数据结构,即自己要爬取的内容,所有item的定义都可以放在这里。
  • pipelines.py:定义item pipeline的实现用于保存数据。
    • 不同的pipeline可以处理不同爬虫的数据,通过spider.name属性来区分。
    • 不同的pipeline能够对一个或多个爬虫进行不同的数据处理的操作,比如一个进行数据清洗,一个进行数据的保存。
    • process_item(self,item,spider):实现对item数据的处理。
    • open_spider(self,spider):在爬虫开启的时候仅执行一次。
    • close_spider(self,spider):在爬虫关闭的时候仅执行一次。

2.10.Scrapy爬虫执行流程

2.11.ScrapyShell

  • ScrapyShell是Scrapy提供的一个终端工具,能够通过它查看Scrapy中对象的属性和方法,以及测试Xpath。
  • 在命令行内输入:scrapy shell <网站的url>,进入Python的交互式终端。
  • 进入交互式命令行:scrapy shell http://xxxx.xxx
  • 进入交互式命令行后:
    • response.xpath():直接测试xpath规则是否正确。
    • response.url:当前响应的url地址。
    • response.request.url:当前响应对应的请求的url地址。
    • response.headers:响应头
    • response.body:响应体,也就是html代码,默认是byte类型。
    • response.requests.headers:当前响应的请求头。

2.12.Scrapy日志

2.13.Scrapy日志解析

  • Scrapy在运行时会默认打印一些日志信息。
    • [scrapy.utils.log] INFO:scrapy工程的settings信息。
    • [scrapy.middleware] INFO:工程启动的扩展程序、下载中间件、管道。
    • [scrapy.extension.telnet] DEBUG:爬虫运行时能够用talnet命令进行控制。
    • [scrapy.statscollectors] INFO:爬虫结束时的一些统计信息。

2.14.爬虫分类

  • Scrapy框架中的爬虫分为两类:Spider和Crawlspider。
  • Spider类的设计原则是只爬取start_url列表中的网页。
  • Crawlspider是Spider的派生类(一个子类),CrawlSpider类定义了一些规则(rule)能够匹配满足条件的URL地址,组装成Request对象后自动发送给引擎,同时能够指定callback函数。

2.15.创建spider

  • 使用命令:scrapy genspider + <爬虫名字> + <允许爬取的域名>

2.16.Spider参数解析

  • 使用命令创建spider后会自动生成一些代码:
    • BaiduSpider:当前的爬虫类。
    • name:爬虫的唯一标识名。
    • allowed_domains:url范围。
    • start_urls:起始爬取的url。
    • parse:数据定位。

2.17.定义parse

parse方法定义了response的处理过程:

  • Scrapy中的response可以直接使用xpath进行数据定位

2.18.Scrapy.Request

scrapy.Request(url[,callback,method=“GET”,headers,body,cookies,meta,dont_filter=False]):scrapy中用于发送请求的类。

  • callback:当前请求url的响应的处理函数。
  • method:指定POST或GET请求。
  • headers:接收一个字典,其中不包括cookies。
  • cookies:接收一个字典,专门放置cookies。
  • body:接收一个字典,为POST的数据。
  • dont_filter:过滤url,不会对已请求过的url再次请求。
  • meta:实现数据在不同的解析函数中传递。

2.19.运行爬虫

在项目目录下执行scrapy crawl +spider

  • scrapy crawl quote
  • 运行后会打印scrapy的项目日志,没有开启管道设置数据处理的方法,爬取的数据也会在日志文件中。

2.20.Crawlspider爬虫创建

创建crawlspider:

  • scrapy genspider -t crawl 爬虫名字 爬取范围
  • scrapy genspider -t crawl crawl_baidu www.baidu.com

2.21.Crawlspider参数解析

相比于Spider,CrawlSpider中多了rules属性。少了parse方法。

  • rules:满足匹配规则的url。
  • Rule表示规则。
  • LinkExtractor:连接提取器,可以通过正则、xpath来进行匹配。
  • callback:表示经过连接提取器提取出来的url地址响应的回调函数。

2.22.Scrapy中间件

  • Scrapy中的中间件主要功能为在爬虫运行过程中进行一些处理,如对于非200的响应后续处理、发送请求时headers字段和cookie的处理。
  • Scrapy中的中间件根据功能可以分为两类:下载中间件、爬虫中间件。

2.23.下载中间件

  • 主要功能在请求到网页后,页面被下载时进行一些处理。
  • 下载中间件Downloader Middlewares:
    • process_request(self,request,spider):当每个request通过下载中间件时,该方法被调用。
    • process_response(self,request,response,spider):当下载器完成http请求,传递响应给引擎时调用。

2.24.爬虫中间件

  • 主要功能是在爬虫运行过程中进行一些处理。
  • 爬虫中间件Spider Middleware:
    • process_spider_input:接收一个response对象并处理。
    • process_spider_exception:spider出现的异常时被调用。

2.25.中间件使用注意事项

  • Scrapy中的中间件写在工程项目中的middlewares.py文件中。
  • 中间件在写好以后需要在settings.py文件中开启。
    • SPIDER_MIDDLEWARES:爬虫中间件
    • DOWNLOADER_MIDDLEWARES:下载中间件
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。