整个框架是简历再twisted异步模型上的 异步:调用在发出后,这个调用直接返回,不管有没有结果 非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程 异步与同步 同步:调用后等待,直到结果出来后才调用下一个方法 异步:调用后不等待,执行下一个方法
爬虫流程
第一步:url队列,将url放入队列
第二步:队列中url取出来,发送请求,获取响应
第三步:获取响应后将响应交给内容提取模块(内容提取----提取url与数据),提取出的url提交到url队列中,数据提交到数据队列
第四步:数据保存
scrapy爬虫流程
第一部分----scheduler(调度器):是一个队列,用于存放requests对象
第二部分----downloader(下载器):requests对象从调度其中取出来后传到下载器。downloader下载器用于发送请求,获取响应(responses)
第三部分----spiders(爬虫):获取响应发送到爬虫中,提取数据,提取url地址组装成requests对象,requests对象提交到scheduler调度器中保存,数据提交给第四部分item pipeline(数据队列)处理保存
第四部分----item pipeline(数据队列/数据管道):处理数据,保存数据
另外三个组件
scrapy engine(scrapy引擎)作用:使四个模块不在相互联系,当某个模块异常时不影响其他模块的正常使用
过程
调度器到下载器的步骤间------将requests对象先提交到引擎中,再由引擎将requests对象交给下载器
下载器到爬虫的步骤间------将responses先提交到引擎中,再由引擎将responses交给爬虫
爬虫到调度器的步骤间------将url组装成requests对象提交到引擎中,再由引擎将requests对象交给调度器
爬虫到数据队列的步骤间------将数据先提交到引擎中,再由引擎将数据交给数据队列
下载中间件(处于引擎与下载器中间):用于对引擎传到下载器的requests和从下载器到引擎的responses进行处理
爬虫中间件(处于引擎与爬虫中间):用于对引擎传到爬虫的responses和从爬虫到引擎的requests进行处理。爬虫中间件不处理数据。
各个组件一览
少了一个调度中间件
Scrapy主要包括了以下组件:
引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务(框架核心)
调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader): 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
由组件图我们可以看出,我们大多时候所需要做的就是去考虑如何把我们所想要的数据爬下来,如何处理,如何保存。
tea_name = response.xpath("//div[@class='tea_con']//h3/text()").extract()
#提取文字 这里得到的列表不是我们平时所用的列表,对列表做了额外处理,使他成为一个自定义的特殊类型
item["name"]=li.xpath(".//h3/text()").extract_first()
item["title"] = li.xpath(".//h4/text()").extract_first()
#extract_first()该方法用于提取第一个字符串
使用pipelines必须在settings.py中开启
可定义多个pipeline,后面跟随的数字为距离,数字越小说明权重越小优先级越高
前一个pipeline必须要有return值,否则返回为none
爬虫必须返回request(request对象),baseitem(在item中所定义的一个类),dict,none中的类型,其他类型不被允许返回
一个项目内可以包含多个爬虫 数据来源不同该如何处理
1 在一个pipeline中处理不同网站数据 方法----在爬虫中标明这些数据来自哪个网站,然后在pipelines中通过if语句判断 实现:添加键["come_from"]
2 在多个pipelines中处理不同来源网站的数据
多个pipelines的情况:
1 一个pipelines处理数据,另一个pipelines存储数据
2 在多个pipelines中处理不同来源网站的数据
pipelines通过spider.name来获取爬虫模块中name的值