从这一章开始,咱们便进入了一个新的模块——scrapy模块,可以说,这是一个爬虫的框架,有了它,能给爬虫带来很大的方便,让它运行更快更强。我们只需要实现少量的代码,就能够快速的抓取数据。

一、Scrapy工作流程二、Scrapy基本操作

一、Scrapy工作流程

Scrapy使用了异步网络框架,可以加快我们的下载速度

这是异步和同步的区别:

python scrapy爬虫 scrapy爬虫流程_Python


同步,容易造成程序阻塞;异步,则不会出现程序阻塞的情况。这是之前的爬虫流程:

python scrapy爬虫 scrapy爬虫流程_ide_02


另外一种爬虫方式:

python scrapy爬虫 scrapy爬虫流程_数据_03


这是Scrapy的爬虫流程:

python scrapy爬虫 scrapy爬虫流程_python_04


下面对Scrapy流程的关键部分进行介绍:

部件

作用

是否需要手写

Scrapy engine(引擎)

总指挥:负责数据和信号的在不同模块间的传递

scrapy已经实现

Scheduler(调度器)

一个队列,存放引擎发过来的request请求

scrapy已经实现

Downloader(下载器)

下载把引擎发过来的requests请求,并返回给引擎

scrapy已经实现

Spider(爬虫)

处理引擎发来的response,提取数据,提取url,并交给引擎

需要手写

Item Pipline(管道)

处理引擎传过来的数据,比如存储

需要手写

Downloader Middlewares(下载中间件)

可以自定义的下载扩展,比如设置代理

一般不用手写

Spider Middlewares(中间件)

可以自定义requests请求和进行response过滤

一般不用手写

二、Scrapy基本操作

1.基本步骤

(1)咱们先创建一个Scrapy项目

scrapy startproject mySpider     # 创建一个名为mySpider的文件

(2)生成一个爬虫

# demo是爬虫名,demo.cn是爬虫的初始网站
scrapy genspider demo  demo.cn

(3)提取数据:完善spider,使用xpath等

(4)保存数据:pipeline中保存数据

2.Scrapy运行

在命令中运行爬虫

scrapy crawl qb     # qb爬虫的名字

在pycharm中运行爬虫(这里要在start文件中运行,与以往不同):

from scrapy import cmdline
cmdline.execute("scrapy crawl qb".split())

3.创建Scrapy新项目

3.1 先在pycharm的terminal终端创建爬虫文件

python scrapy爬虫 scrapy爬虫流程_数据_05


可以看到创建后,有提示:

你能开始你的第一个爬虫用:

cd mySpider # 进入scrapy爬虫项目

scrapy genspider example example.com # example是爬虫项目名字,example.com是爬取的网站如果想在别的文件夹下创建,直接用cd 文件夹路径即可

python scrapy爬虫 scrapy爬虫流程_Python_06


python scrapy爬虫 scrapy爬虫流程_python scrapy爬虫_07


可以发现,在创建后,出现了新的文件夹mySpider以及一些py文件、配置文件

3.2 创建爬虫新项目

如我们要爬取豆瓣,就创建一个名为db的爬虫项目

python scrapy爬虫 scrapy爬虫流程_ide_08


发现又多了一个db.py文件

python scrapy爬虫 scrapy爬虫流程_python_09


此时要运行,要通过terminal终端输入:scrapy crawl db

运行结果如下:

python scrapy爬虫 scrapy爬虫流程_python scrapy爬虫_10


可以看到,结果太多了,那么有没有什么方法来消除这些结果,只显示我们想要的呢?这里要到setting设置文件中,加入LOG_LEVEL = ‘WARNING’,加上以后,表示log信息要在出现警告、错误的时候才会出现

python scrapy爬虫 scrapy爬虫流程_python scrapy爬虫_11


在爬虫文件db中,代码显示如下:

python scrapy爬虫 scrapy爬虫流程_python scrapy爬虫_12


先定义了,其中第一个参数是爬虫名,第二个参数是允许爬取的网站范围,第三个参数是起始的url(其中的url是可以修改的,根据自己的需求而定);定义了一个解析函数,可以在其中写入爬虫的解析方法,数据获取。这些方法,咱们之前都介绍过。

python scrapy爬虫 scrapy爬虫流程_python scrapy爬虫_13


如要爬取正在热映的电影名称,可以在解析函数parse()下写逻辑:

def parse(self, response):
        # 找正在热映的电影信息
        print("="*50)
        movie_list = response.xpath("//div[@class='movie-list list']/ul/li/div[@class='title']")
        print movie_list

结果如下:

python scrapy爬虫 scrapy爬虫流程_ide_14


现在要把其中的名称提取出来,可以通过遍历来实现:

# 定义字典
        item = {}
        for movie in movie_list:
            item['name'] = movie.xpath("a/text()").extract_first()
            # extract_first() 是从中得到文本的数据(去掉了标签)

            if item['name'] == None:
                item['name'] = movie.xpath("a/text()").extract_first()
                
            print(item)

结果如下:

python scrapy爬虫 scrapy爬虫流程_ide_15

3.3 运行爬虫新项目的另一种方式

咱们可以在myspider文件夹下新建一个start.py文件,中间写上几条代码:

python scrapy爬虫 scrapy爬虫流程_ide_16


之后,直接在start.py文件中右键run即可运行程序

这样运行,跟第一种方法(terminal终端运行)也能达到同样的效果。大家可以从中选择一种自己喜欢的方式取运行scrapy,我个人觉得第二种方法更加方便。

3.4 实现数据的传递

在scrapy中,之前说过,数据是通过pipeline传递,在咱们的pipeline文件中,已经有了提示:Don’t forget to add your pipeline to the ITEM_PIPELINES setting,因此要在setting文件中,要记得把管道相关注释打开,数据才能传递

python scrapy爬虫 scrapy爬虫流程_python scrapy爬虫_17


管道可以有多个,这里的300是指数据传递的优先级,默认从300开始,数字越大,优先级越往后;数字越小,优先级越高。

还要注意,**在爬虫文件db中,返回数据要用yield,而不是return。**这是一种资源优化问题。yield能实现要几个数就取几个数,且不占用内存。

今天咱们简单介绍了scrapy框架的一些功能,并简单爬取了豆瓣的热映电影。在后面的章节,将会继续深入介绍scrapy爬虫框架。