Scrapy框架结构及工作原理

Scrapy框架中的各个组件:
| 组件 | 描述 | 类型 |
|---|---|---|
| ENDINE | 引擎,框架的核心,其他所有组件在其控制下协同工作 | 内部组件 |
| SCHEDULER | 调度器,负责对SPIDER提交的下载请求进行调度 | 内部组件 |
| DOWNLOADER | 下载器,负责下载页面(发送HTTP请求/接收HTTP响应) | 内部组件 |
| SPIDER | 爬虫,负责提取页面中的数据,并产生对新页面的下载请求 | 用户实现 |
| MIDDLEWARE | 中间件,负责对Request和Response对象进行处理 | 可选组件 |
| ITEM PIPELINE | 数据管道,负责对爬取到的数据进行处理 | 可选组件 |
对用户来说,Spider是最核心的组件,Scrapy爬虫开发是围绕实现Spider展开的。
在框架中的数据流,有如下三种对象:
| 对象 | 描述 |
|---|---|
| REQUEST | Scrapy中的HTTP请求对象 |
| RESPONSE | Scrapy中的HTTP响应对象 |
| ITEM | 从页面中爬取的一项数据 |
以上几种对象在框架中的流动过程:
- 当
SPIDER要爬取某URL地址的页面时,需使用该URL构造一个Request对象,提交给ENGINE Request对象随后进入SCHEDULER中排队,之后的某个时刻出队,送往DOWNLOADERDOWNLOADER根据Request对象中的URL地址发送一次HTTP请求到网站服务器,之后用服务器返回的HTTP响应构造出一个Response对象,其中包含页面的HTML文本Response对象最终会被递送给SPIDER的页面解析函数进行处理,页面解析函数从页面中提取数据,封装成Item后提交给ENGINE,Item之后被送往ITEM PIPELINES进行处理,最终可能被EXPORTER以某种数据格式写入文件;另一方面,,页面解析函数还从页面中提取链接(URL),构造出新的Request对象提交给ENGINE
如果把框架中的组件比作人体的各个器官,Request和Response对象便是血液,Item则是代谢产物
Request和Response对象
Request对象
Request(url[,callback,method='GET',headers,body,cookies,meta,encoding='utf-8',priority=0,dont_filter=False,errback])
参数的含义:
- url(必选):请求页面的
url地址,bytes或str类型 callback:页面解析函数,默认为Scrapy的parse方法- method:
HTTP请求的方法,默认为‘GET’ - headers:
HTTP请求的头部字典,dict类型。如果某项值为None,则不发送该项HTTP头部 - body:
HTTP请求的正文,bytes或str类型 cookies:Cookie信息字典,dict类型- meta:
Request的元数据字典,dict类型,用于给框架中其他组件传递信息 encoding:默认编码‘utf-8’priority:请求的优先级默认值为0dont_filter:默认为False,对同一个url地址多次请求下载要求,后面的请求会被去重过滤器过滤errback:请求出现异常或者出现HTTP请求时的回调函数
上述蓝色属性为常用属性
Response对象
Response为一个基类,它有如下子类,这三个子类差别不大:
TextResponseHTMLResponseXmlResponse
HTMLResponse对象的属性及方法:
url:请求页面的url地址,bytes或str类型status:状态码,int类型headers:HTTP请求的头部字典,类字典类型。body:HTTP响应正文,bytes类型text:文本形式的HTTP响应正文,str类型encodingrequest:产生该HTTP响应的Request对象meta:即Response.request.metaselector:Selector对象用于在Rexponse中提取数据- xpath(query):提取数据
- css(query):提取数据
- urljoin(url):构造绝对
url
Spider开发流程
- 继承
scrapy.Spider - 为
Spider取名 - 设定起始爬取点
- 实现页面解析函数
为爬虫设定起始爬取点的两种方式:
- 定义
start_urls属性 - 实现
start_requests方法
791

被折叠的 条评论
为什么被折叠?



