《精通Scrapy网络爬虫》第二章
第二章 编写Spider
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
中排队,之后的某个时刻出队,送往DOWNLOADER
-
DOWNLOADER
根据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
:请求的优先级默认值为0 -
dont_filter
:默认为False
,对同一个url
地址多次请求下载要求,后面的请求会被去重过滤器过滤 -
errback
:请求出现异常或者出现HTTP
请求时的回调函数
上述蓝色属性为常用属性
Response对象
Response
为一个基类,它有如下子类,这三个子类差别不大:
-
TextResponse
HTMLResponse
XmlResponse
HTMLResponse
对象的属性及方法:
-
url
:请求页面的url
地址,bytes
或str
类型 -
status
:状态码,int类型 -
headers
:HTTP
请求的头部字典,类字典类型。 -
body
:HTTP
响应正文,bytes
类型 -
text
:文本形式的HTTP响应正文,str
类型 encoding
-
request
:产生该HTTP
响应的Request
对象 -
meta
:即Response.request.meta
-
selector
:Selector
对象用于在Rexponse
中提取数据 - xpath(query):提取数据
- css(query):提取数据
-
urljoin(url):构造绝对
url
Spider开发流程
- 继承
scrapy.Spider
- 为
Spider
取名 - 设定起始爬取点
- 实现页面解析函数
为爬虫设定起始爬取点的两种方式:
- 定义
start_urls
属性 - 实现
start_requests
方法