python Scrapy框架1—框架流程、结构和一个简单的例子
python爬虫学习_Scrapy框架1—框架流程、结构和一个简单的例子
框架图
-
Scrapy Engine(引擎)
: 负责Spider
、ItemPipeline
、Downloader
、Scheduler
中间的通讯,信号、数据传递等。 -
Scheduler(调度器)
: 它负责接受引擎
发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎
需要时,交还给引擎
。 -
Downloader(下载器)
:负责下载Scrapy Engine(引擎)
发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎)
,由引擎
交给Spider
来处理, -
Spider(爬虫)
:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎
,再次进入Scheduler(调度器)
, -
Item Pipeline(管道)
:它负责处理Spider
中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方. -
Downloader Middlewares(下载中间件)
:你可以当作是一个可以自定义扩展下载功能的组件。 -
Spider Middlewares(Spider中间件)
:你可以理解为是一个可以自定扩展和操作引擎
和Spider
中间通信
的功能组件(比如进入Spider
的Responses;和从Spider
出去的Requests)
Scrapy运行流程:
-
引擎
:Hi!Spider
, 你要处理哪一个网站? -
Spider
:老大要我处理xxxx.com。 -
引擎
:你把第一个需要处理的URL给我吧。 -
Spider
:给你,第一个URL是xxxxxxx.com。 -
引擎
:Hi!调度器
,我这有request请求你帮我排序入队一下。 -
调度器
:好的,正在处理你等一下。 -
引擎
:Hi!调度器
,把你处理好的request请求给我。 -
调度器
:给你,这是我处理好的request -
引擎
:Hi!下载器,你按照老大的下载中间件
的设置帮我下载一下这个request请求 -
下载器
:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎
告诉调度器
,这个request下载失败了,你记录一下,我们待会儿再下载) -
引擎
:Hi!Spider
,这是下载好的东西,并且已经按照老大的下载中间件
处理过了,你自己处理一***意!这儿responses默认是交给def parse()
这个函数处理的) -
Spider
:(处理完毕数据之后对于需要跟进的URL),Hi!引擎
,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。 -
引擎
:Hi !管道
我这儿有个item你帮我处理一下!调度器
!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。 -
管道``调度器
:好的,现在就做!
Scrapy使用
1、安装环境scrapy环境
sudo pip install Scrapy
2、创建scrapy文件夹
scrapy startproject myproject
在我们的环境当中还要引入scrapy模块的。
3、创建之后的文件夹:
scrapy.cfg :项目的配置文件
TestForSpider/ :项目的Python模块,将会从这里引用代码
TestForSpider/items.py :项目的目标文件
TestForSpider/pipelines.py :项目的管道文件
TestForSpider/settings.py :项目的设置文件
TestForSpider/spiders/ :存储爬虫代码目录
4、写我们的scrapy代码
我们的爬虫数据放在spiders里面
# -*- coding: utf-8 -*-
import scrapy
from TestForScrapy.items import ItcastItem
class ItcastSpider(scrapy.Spider):
name = "itcast"
start_urls = [ # 另外一种写法,无需定义start_requests方法
'http://www.itcast.cn/channel/teacher.shtml',
]
def parse(self, response):
page = response.url.split("/")[-2]
# 根据上面的链接提取分页,如:/page/1/,提取到的就是:1
filename = 'teacher-%s.html' % page
# 拼接文件名,如果是第一页,最终文件名便是:mingyan-1.html
with open(filename, 'wb') as f:
# python文件操作,不多说了;
f.write(response.body)
5、运行爬虫
在terminal中要进入TestForSpider的目录下,执行
scrapy crawl itcast
当出现:
则数据拉取成功