[华为云在线课程][Python网络爬虫][Scrapy框架介绍][七][学习笔记]
【摘要】 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 + <爬虫名字> + <允许爬取的域名>
- scrapy genspider baidu www.baidu.com
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)