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

编程

前言
保存本地
存储Json数据
配置setting
保存数据库
创建数据库
创建表
编写pipelines
配置setting

本文是对上篇文章所讲的代码进一步优化,回看可以点这里,代码就直接在上一篇代码中进行改造,没有的小伙伴可以在这里下载。

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

保存本地
存储Json数据
找到pipelines.py文件,编写下面代码:

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

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


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

到这里,代码就已经写好了,下面就运行起来看看。
运行成功后会在目录下多出一个文件出来。如图:

打开可以看看:

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

保存数据库
创建数据库
使用命令创建数据库

CREATE DATABASE `crawler`
1
也可以使用工具创建数据库,我这里是使用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`)
);
1
2
3
4
5
6
使用工具创建表


编写pipelines
在新增一个pipelines

添加相应的包


配置setting


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

爬取数据输出结果

数据保存数据库的结果
在图上可以看出,爬取的数据结果是没有错的,但是在保存数据的时候出错了,出现重复数据。那为什么会造成这种结果呢?
其原因是由于Spider的速率比较快,而scapy操作数据库操作比较慢,导致pipeline中的方法调用较慢,这样当一个变量正在处理的时候,一个新的变量过来,之前的变量的值就会被覆盖。
就比如pipline的速率是1TPS,而spider的速率是5TPS,那么数据库应该会有5条重复数据。

解决方案是对变量进行保存,在保存的变量进行操作,通过互斥确保变量不被修改。
下面将代码进行改造一下:

并在头部到了copy包

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

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

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

文中代码部分都是用图片的,目的是希望小伙伴们可以直接上手自己敲,代码只有敲多了才能记得更牢,才能学的更快。
本文源代码会在下面给出,如果有什么不懂的地方可以直接下载源代码查看。
因为本人也是一名初学者,如果有什么好的建议欢迎大家在评论中写出,大家一起学习!

以上是 python3+Scrapy爬虫实战(二)——使用pipeline数据保存到文本和数据库(mysql) 的全部内容, 来源链接: utcz.com/z/517830.html

回到顶部