![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg)
*****
## 为什么要学习scrapy
![](https://img.kancloud.cn/78/11/78116e115a25c92a7f1bd003576777bc_1039x503.png)
## 什么是Scrapy
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取
Scrapy使用了Twisted异步网络框架,可以加快我们的下载速度
http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
## 异步和非阻塞的区别
![](https://img.kancloud.cn/20/f1/20f18a9397ea247648bfe5163d97b816_1426x482.png)
异步:调用在发出之后,这个调用就直接返回,不管有无结果
非阻塞:关注的是程序在等待调用结果时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程。
## Scrapy工作流程
**回顾之前的爬虫流程**
![](https://img.kancloud.cn/75/37/753759540cf54ee477fc791261ee6b0c_1353x755.png)
**另外一种爬虫方式**
![](https://img.kancloud.cn/8d/b1/8db1d34f240a4d28f9a6a85497ab58bb_1130x584.png)
*****
**Scrapy的爬虫流程**
![](https://img.kancloud.cn/87/1c/871ca6c393c6bf98da4f1a81d935e2e1_1130x668.png)
| Scrapy engine(引擎) | 总指挥:负责数据和信号的在不同模块间的传递 | scrapy已经实现 |
|--- | --- | --- |
| Scheduler(调度器) | 一个队列,存放引擎发过来的request请求 | scrapy已经实现|
| Downloader(下载器) | 下载把引擎发过来的requests请求,并返回给引擎 | scrapy已经实现|
| Spider(爬虫) | 处理引擎发来的response,提取数据,提取url,并交给引擎 | 需要手写|
| Item Pipline(管道) | 处理引擎传过来的数据,比如存储 | 需要手写|
| Downloader Middlewares(下载中间件) | 可以自定义的下载扩展,比如设置代理 | 一般不用手写|
| Spider Middlewares(中间件) | 可以自定义requests请求和进行response过滤 | 一般不用手写|
## Scrapy入门
```
1 创建一个scrapy项目
scrapy startproject mySpider
2 生成一个爬虫
scrapy genspider demo "demo.cn"
3 提取数据
完善spider 使用xpath等
4 保存数据
pipeline中保存数据
```
## 创建一个scrapy项目