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

  • python3+Scrapy爬虫实战(一)—— 初识Scrapy

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

转载请注明作者和出处:https://blog.csdn.net/finn_wft/article/details/80885048

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

前言

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

保存本地

存储Json数据

找到pipelines.py文件,编写下面代码:
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第1张图片
这里用到了json包,如果没有的小伙伴可以直接在命令窗口进行下载,下载代码:

pip install json

回到hotel.py文件,将“print(item)”改成“yeild item”
这里写图片描述

配置setting

打开pipelines通道注释,在里面新增一条我们在pipelines中添加的记录
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第2张图片
到这里,代码就已经写好了,下面就运行起来看看。
运行成功后会在目录下多出一个文件出来。如图:
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第3张图片
打开可以看看:
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第4张图片
就是我们想要的。其实pipelines也是很简单,在新增一个pipelines时,只要重写“process_item”方法就可以了。

保存数据库

创建数据库

使用命令创建数据库

CREATE DATABASE `crawler`

也可以使用工具创建数据库,我这里是使用Navicat工具创建的。
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第5张图片

创建表

使用命令创建表

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`)
);

使用工具创建表
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第6张图片

编写pipelines

在新增一个pipelines
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第7张图片
添加相应的包
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第8张图片

配置setting

python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第9张图片
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第10张图片
到这里,代码就基本写完了,下面我们运行起来看看。
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第11张图片
爬取数据输出结果
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第12张图片
数据保存数据库的结果
在图上可以看出,爬取的数据结果是没有错的,但是在保存数据的时候出错了,出现重复数据。那为什么会造成这种结果呢?
其原因是由于Spider的速率比较快,而scapy操作数据库操作比较慢,导致pipeline中的方法调用较慢,这样当一个变量正在处理的时候,一个新的变量过来,之前的变量的值就会被覆盖。
就比如pipline的速率是1TPS,而spider的速率是5TPS,那么数据库应该会有5条重复数据。

解决方案是对变量进行保存,在保存的变量进行操作,通过互斥确保变量不被修改。
下面将代码进行改造一下:
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第13张图片
并在头部到了copy包

import copy

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

pip install copy

然后先把数据库的数据清空一下,在来运行看看:
python3+Scrapy爬虫实战(二)—— 使用pipeline数据保存到文本和数据库(mysql)_第14张图片
现在数据就正常了,可以看到总数据才950条,不像之前那样上千条。

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

源码下载

csdn下载

你可能感兴趣的:(python)