python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)

前言

Scrapy 提供了 pipeline 模块来执行保存数据的操作。在创建的 Scrapy 项目中自动创建了一个 pipeline.py 文件,同时创建了一个默认的 Pipeline 类。我们可以根据需要自定义 Pipeline 类,然后在 settings.py 文件中进行配置即可。

保存本地

存储Json数据

找到pipelines.py文件,编写下面代码:

这里用到了json包,如果没有的小伙伴可以直接在命令窗口进行下载,下载代码:

pip  install  json

回到hotel.py文件,将“print(item)”改成“yeild item” 

配置setting

打开pipelines通道注释,在里面新增一条我们在pipelines中添加的记录 

到这里,代码就已经写好了,下面就运行起来看看。 

运行成功后会在目录下多出一个文件出来。如图: 

打开可以看看: 

就是我们想要的。其实pipelines也是很简单,在新增一个pipelines时,只要重写“process_item”方法就可以了。

保存数据库

创建数据库

使用命令创建数据库

CREATEDATABASE`crawler`

也可以使用工具创建数据库,我这里是使用Navicat工具创建的。 

创建表

使用命令创建表

CREATE TABLE `qunar_city` (

`id`  int NOT NULL AUTO_INCREMENT COMMENT '主键' ,

`name`  varchar(50) NULL COMMENT '城市' ,

`url`  varchar(500) NULL COMMENT 'url' ,

PRIMARY KEY (`id`)

);

使用工具创建表

编写pipelines

在新增一个pipelines 

添加相应的包 

配置setting

到这里,代码就基本写完了,下面我们运行起来看看。 

爬取数据输出结果 

数据保存数据库的结果

在图上可以看出,爬取的数据结果是没有错的,但是在保存数据的时候出错了,出现重复数据。那为什么会造成这种结果呢?

其原因是由于Spider的速率比较快,而scapy操作数据库操作比较慢,导致pipeline中的方法调用较慢,这样当一个变量正在处理的时候,一个新的变量过来,之前的变量的值就会被覆盖。

就比如pipline的速率是1TPS,而spider的速率是5TPS,那么数据库应该会有5条重复数据。

解决方案是对变量进行保存,在保存的变量进行操作,通过互斥确保变量不被修改。

下面将代码进行改造一下:

并在头部到了copy包

import copy

没有copy包的小伙伴可以在命令窗口进行下载

pip install copy

然后先把数据库的数据清空一下,在来运行看看: 

现在数据就正常了,可以看到总数据才950条,不像之前那样上千条。

文中代码部分都是用图片的,目的是希望小伙伴们可以直接上手自己敲,代码只有敲多了才能记得更牢,才能学的更快。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容