目录
1. Scrapy介绍
1.1 什么是Scrapy
1.2 爬虫的几种工作模式
2. Scrapy的工作流程
3.Scrapy入门
4. pipline使用
Scrapy是⼀个为了爬取⽹站数据,提取结构性数据⽽编写的应⽤框架,我们只需要实现少量的代码,就能够快速的抓取
特点:Scrapy使⽤了Twisted异步⽹络框架,可以加快我们的下载速度(相同条件下用Scrapy爬取信息的速度要比直接爬取的速度快很多,有时几乎是瞬时的,具体例子在后续会给出)安装:pip install scrapy (因为Scrapy框架较大,直接安装速度慢且容易失败,因此可以采用换源安装,如:pip install scrapy -i https://pypi.douban.com/simple)异步和⾮阻塞的区别:
异步:调⽤在发出之后,这个调⽤就直接返回,不管有⽆结果
⾮阻塞:关注的是程序在等待调⽤结果时的状态,指在不能⽴刻得到结果之 前,该调⽤不会阻塞当前线程
Scrapy engine(引擎)总指挥:负责数据和信号的在不同模块间的传递scrapy已经实现Scheduler(调度器)⼀个队列,存放引擎发过来的request请求scrapy已经实现Downloader(下载器)下载把引擎发过来的requests请求,并返回给引擎scrapy已经实现Spider(爬⾍)处理引擎发来的response,提取数据,提取url,并交给引擎需要⼿写Item Pipline(管道) 处理引擎传过来的数据,⽐如存储需要⼿写Middlewares(下载中间件)可以⾃定义的下载扩展,⽐如设置代理 ⼀般不⽤⼿写 Spider Middlewares(中间件)可以⾃定义requests请求和进⾏response过滤⼀般不⽤⼿写
1. 创建一个爬虫项目
在编译器或命令提示符中输入 scrapy startproject myspider(myspider是项目文件夹名称,可自定义)
2. 生成一个爬虫
首先进入myspider文件夹中:终端输入cd myspider
然后输入命令 scrapy genspider douban douban.com(douban是设置的爬虫文件名称,后面是要爬取的网址域名,这里以豆瓣网为例)
3.提取数据
完善spider,前面我们说spider的作用是处理引擎发来的response,提取数据,提取url,并交给引擎,需要我们手动写入。可以利用xpath,css,bs4等
4.保存数据
在pipeline中保存数据
5.在命令中运行爬虫
与一般爬虫不同的是,使用scrapy来运行爬虫不能直接在编译器中点击运行,而是在终端输入:
scrapy crawl douban(douban是爬虫文件的名称,自定义)
6.在编译器中运行爬虫
如果一定要在编译器直接运行爬虫也不是没有办法,我们可以新建一个py文件,在里面写入:
from scrapy import cmdline cmdline.execute("scrapy crawl douban".split()) # 同上,douban是爬虫的名称 #也可写为 cmdline.excute(['scrapy','crawl','douban'])创建myspider时会在myspider文件夹中生成spiders文件夹(生成的douban.py就在其中)以及spipline.py文件、pipline.py文件、middlewares.py文件等。上面提到保存数据是在pipline.py文件中执行的。
在运行pipline.py之前,我们还需要在settings.py中找到如下所示代码,将其打开(原本处于注释状态):
从pipeline的字典形可以看出来,pipeline可以有多个,⽽且确实pipeline能够 定义多个 为什么需要多个pipeline: 1. 可能会有多个spider,不同的pipeline处理不同的item的内容 2. ⼀个spider的内容可以要做不同的操作,⽐如存⼊不同的数据库中 注意: 1. pipeline的权重越⼩优先级越⾼(假设我们再加入'dbspider.pipelines.DbspiderPipeline':301,那么按照优先级就会先执行mySpider中的spider) 2. pipeline中process_item⽅法名不能修改为其他的名称(其实也是可以修改的,但并不建议这么做)
以上是对Scrapy框架的简单介绍,通过对上述内容的理解可以帮助我们简单的实现运用Scrapy来爬取信息的目的。然而仅仅是这样还不足以体现Scrapy框架的强大功能,后续将继续对Scrapy框架做拓展和实例
有兴趣可以参考Scrapy的中文文档:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
官方文档也在此给出:https://docs.scrapy.org/en/latest/