学习爬虫之Scrapy框架学习(八)---Scrapy框架里使用分布式爬虫;分布式实战纵横小说爬取+项目完整源码!(1)

See https://docs.scrapy.org/en/latest/topics/item-pipeline.html

ITEM_PIPELINES = {

开启保存Mysql数据库的管道

‘zongheng.pipelines.ZonghengPipeline’: 300,

开启保存数据至redis公共区域的数据库

‘scrapy_redis.pipelines.RedisPipeline’: 100,

}

2.第二步:爬虫文件中进行如下修改!


在这里插入图片描述

最后,运行观察!


**1.首先,命令运行项目,发现项目在等待。

2.然后,向redis数据库中放入第一个起始URL,命令为:lpush zh:start_urls http://book.zongheng.com/store/c0/c0/b0/u1/p1/v0/s1/t0/u0/i1/ALL.html。

3.项目正常运行!可以通过Redis Desktop Manager工具观察到redis数据库中的URL数据等。**

在这里插入图片描述

4.运行结束后,通过Navicat工具观察到Mysql数据库中小说信息爬取正常!

在这里插入图片描述在这里插入图片描述

小拓展:如何使用Navicat工具清空Mysql数据库中数据表里的数据!


使用truncate命令的原因是:删除速度快;而且如果再次对同一张表中写入数据,自增长key会从初始值开始!

在这里插入图片描述

2.然后,将此项目(称为项目一)再复制一个(称为项目二),并且为了便于观察,项目一的数据存入chapter和novel表中;项目二中的数据存入novel_copy和chapter表中。实质上两表结构一模一样!

=======================================================================================================================================================================

因为项目二存入的表名更改了,所以要更改pipelines.py文件中的mysql语句中的表名(将所有的表名novel改为novel_copy;所有的chapter改为chapter_copy)!

①但是,我们运行此分布式项目后,通过Navicat观察Mysql数据库中的数据时会发现——novel和novel_copy表中数据相加刚好为目标本数;但是,chapter和chapter_copy表会出现一个问题,比如:chapter_copy表中小说章节信息都有,然后有四章章节有具体章节内容,但是我们爬虫文件中限制的是六章章节有具体章节内容,理应chapter表中有另外两章章节的具体内容,但是观察会发现chapter表中是空的!!!


②分析:


在这里插入图片描述

回想——我们之前向Mysql数据库中存入小说章节信息的思路是:先存入小说所有章节的信息(但不包括章节具体章节内容信息),注意是一次存入所有章节信息;然后:


在这里插入图片描述

存入章节具体章节信息的思路是:对应小说的章节URL(chapter_url)进行存储。即:先查询到表中有这个chapter_url,才会update其对应的章节具体章节内容!


但是小说所有章节信息是一次性插入,即会出现一张表有一张表没有的现象!所以,会出现以上所述问题!!!(但是实质上,我们实现了分布式,缺具体章节内容的其实被另一个项目处理了,只是没能存储进数据库!)


3.那么,如何获取完整的数据呢?我们可以想到,在settings.py中我们开启了将所有数据都放入redis数据库中公共区域的管道!但是,redis是个内存数据库,数据不能持久化,这里就想到了将redis数据库中的数据搬运到Mysql数据库中,即可!!!

=============================================================================================================================================================================================

①首先,从Redsi中取出数据试试可不可以:

创建一个.py脚本文件即可:

import redis

import pymysql

import json

#指定redis数据库信息

rediscli=redis.StrictRedis(host=“localhost”,port=6379,db=0)

#指定mysql数据库

mysqlconn=pymysql.connect(host=“localhost”,port=3306,user=“root”,password=“123456”,db=“”,charset=“utf8”)

#取出数据

source, data = rediscli.blpop([“bh3:items”]) # 数据是字节码格式

print(source, data)

item = json.loads(data)

print(item)

打印观察数据:

在这里插入图片描述

②从Redsi中取出数据完全OK,接下来就进行存储进Mysql数据库的操作!(注意:Redis这个公共区域空间存储了框架运行过程空爬取的所有数据,所以进行Mysql存储操作时要进行判断,所取出的那一条数据属于什么数据,是小说信息;章节信息还是章节具体内容信息)

import datetime

import redis

import pymysql

import json

#指定redis数据库信息

rediscli=redis.StrictRedis(host=“localhost”,port=6379,db=0)

#指定mysql数据库

mysqlconn=pymysql.connect(host=“localhost”,port=3306,user=“root”,password=“123456”,db=“spider39”,charset=“utf8”)

while True:

#取出数据

source, data = rediscli.blpop([“bh3:items”]) # 数据是字节码格式

print(source, data)

item = json.loads(data)

print(item)

#写入数据

cursor=mysqlconn.cursor()

if b"book_name" in data:

sql = “select id from novel_from_redis where book_name=%s and author=%s”

cursor.execute(sql, (item[“book_name”], item[“author”]))

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值