转载请注明作者和出处:https://blog.csdn.net/finn_wft/article/details/80885048
本文是对上篇文章所讲的代码进一步优化,回看可以点这里,代码就直接在上一篇代码中进行改造,没有的小伙伴可以在这里下载。
前言
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”方法就可以了。
保存数据库
创建数据库
使用命令创建数据库
CREATE DATABASE `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条,不像之前那样上千条。
文中代码部分都是用图片的,目的是希望小伙伴们可以直接上手自己敲,代码只有敲多了才能记得更牢,才能学的更快。
本文源代码会在下面给出,如果有什么不懂的地方可以直接下载源代码查看。
因为本人也是一名初学者,如果有什么好的建议欢迎大家在评论中写出,大家一起学习!