十五:爬虫-Scrapy-redis分布式

news2024/12/23 20:56:25

一:python操作redis

1.redis的安装与连接

安装
pip install redis
连接
r = redis.StrictRedis(host='localhost',port=6379,db=0)

2.redis数据类型相关操作

(1)字符串相关操作
import redis
class TestString(object):
    # 初始化 连接redis数据库
    def __init__(self):
        self.r = redis.StrictRedis(host='127.0.0.1', port=6379)

    # 设置值
    def test_set(self):
        res = self.r.set('user1', 'yueyue-1')
        print(res)

    # 取值
    def test_get(self):
        res = self.r.get('user1')
        print(res,type(res))
        res = res.decode('UTF-8')
        print(res, type(res))

    # 设置多个值
    def test_mset(self):
        d = {
            'user2': 'yueyue-2',
            'user3': 'yueyue-3'
        }
        res = self.r.mset(d)
        print(res)

    # 取多个值
    def test_mget(self):
        l = ['user2', 'user3']
        res = self.r.mget(l)
        print(res)

    # 删除
    def test_del(self):
        self.r.delete('user2')

if __name__ == '__main__':
    t = TestString()
    # t.test_set()
    t.test_get()


(2)列表相关操作
import redis

class TestList(object):
    def __init__(self):
        self.r = redis.StrictRedis(host='localhost', port=6379, db=1)

    # 插入记录
    def test_push(self):
        res = self.r.lpush('common', '1')
        print(res)
        res = self.r.rpush('common', '2')
        print(res)

    # 弹出记录
    def test_pop(self):
        res = self.r.lpop('common')
        res = self.r.rpop('common')

    # 范围取值
    def test_range(self):
        res = self.r.lrange('common', 0, -1)
        print(res)

if __name__ == '__main__':
    t = TestList()
    # t.test_set()
    # t.test_push()
    t.test_range()
(3)集合相关操作
import redis


class TestSet(object):
    def __init__(self):
        self.r = redis.StrictRedis(host='localhost', port=6379, db=1)

    # 添加数据
    def test_sadd(self):
        res = self.r.sadd('set01', '1', '2')
        # redis升级到3.0以后不支持 bytes, string, int , float以外的数据类型。

    # 删除数据
    def test_del(self):
        res = self.r.srem('set01', 1)

    # 随机删除数据
    def test_pop(self):
        res = self.r.spop('set01')


if __name__ == '__main__':
    t = TestSet()
    # t.test_set()
    # t.test_push()
    t.test_pop()

(4)哈希相关操作
import redis


class TestHash(object):
    def __init__(self):
        self.r = redis.StrictRedis(host='localhost', port=6379, db=1)

    # 批量设值
    def test_hset(self):
        dic = {
            'id': 1,
            'name': 'huawei'
        }
        res = self.r.hmset('mobile', dic)


    # 批量取值
    def test_hgetall(self):
        res = self.r.hgetall('mobile')
        print(res)

    # 判断是否存在	存在返回1  不存在返回0
    def test_hexists(self):
        res = self.r.hexists('mobile', 'id')
        print(res)


if __name__ == '__main__':
    t = TestHash()
    # t.test_set()
    # t.test_push()
    t.test_hexists()

二:scrapy_redis操作分布式爬虫

1.scrapy-redis介绍

1  Scrapy分布式爬虫意味着几台机器通过某种方式共同执行一套爬取任务,
这就首先要求每台机器都要有Scrapy框架,一套Scrapy框架就有一套Scrapy五大核心组件,
引擎--调度器--下载器--爬虫--项目管道,各自独有的调度器没有办法实现任务的共享,
所以不能实现分布式爬取。
2  假设可以实现Scrapy框架的调度器共享,那么就能实现分布式爬取了吗?
答案是不能,因为我们实现了任务的共享,但是框架之间的项目管道是单独的,
我们的任务下载完之后,我们爬取的有效信息还是不能全部存放在某个指定的位置,
所以要想实现分布式爬虫,需要同时满足调度器和项目管道的共享才可以达到分布式的效果。

2.共享爬取队列的维护

集合 无序且不重复  请求去重 达到去重的效果 

3.scrapy-redis工作流程

scrapy-redis.png

4.scrapy_redis中的settings文件

# Scrapy settings for example project
#
# For simplicity, this file contains only the most important settings by
# default. All the other settings are documented here:
#
#     http://doc.scrapy.org/topics/settings.html
#
SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'
# 需要改
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
# 指定去重方式 给请求对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"    # 指定那个去重方法给request对象去重
# 设置调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"    # 指定Scheduler队列
# 队列中的内容是否进行持久保留 True redis关闭的时候数据会保留
# False 不会保留
SCHEDULER_PERSIST = True        # 队列中的内容是否持久保存,为false的时候在关闭Redis的时候,清空Redis
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,    # scrapy_redis实现的items保存到redis的pipline
}

LOG_LEVEL = 'DEBUG'

# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 1

5.运行结束后redis中多了三个键


dmoz:requests 存储待爬取的请求对象。
这些请求可能包括爬取的URL、请求头、请求体等信息。
Scrapy使用这些请求对象来发送HTTP请求并获取响应数据。

dmoz:item 存储已经爬取到的数据。
这些数据可能包括HTML页面中提取的文本、链接、图片等信息。
Scrapy使用这些数据来进行进一步的分析和处理。

dmoz:dupefilter 存储已经爬取过的请求的指纹。
Scrapy使用指纹来避免重复爬取同一个URL。
如果一个请求的指纹已经存在于dupefilter中,那么Scrapy将不会再次爬取该请求。

6.setings文件的补充

setings.py

# 取消日志
# LOG_LEVEL = 'WARNING'

# 需要改
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
# 指定去重方式 给请求对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 队列中的内容是否进行持久保留 True redis关闭的时候数据会保留
# False 不会保留
SCHEDULER_PERSIST = True


# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}


ITEM_PIPELINES = {
    # 'DMBJ.pipelines.DmbjPipeline': 300,
    # 将数据保存到redis中
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小游戏实战丨基于Tkinter的五子棋小游戏

文章目录 写在前面Tkinter五子棋系列文章写在后面 写在前面 本期内容:基于tkinter的五子棋小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700190 实验环境 python3.11及以上pycharmtkinter Tkinter Tkinter是Python的一个标准…

ssm基于BS的项目监管系统+jsp论文

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

AP2813 双路降压恒流驱动IC 一路内置1A一路外置3A LED储能指示灯线路

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、简单、内置功率管,适用于 5-80V 输入的高精度降 压 LED 恒流驱动芯片。内置功率管输出功率可达 12W,电流 1.2A。 AP2813 一路直亮,另外一路通过 MODE1 切换 全亮,爆闪。AP2813…

异常..

1.开发过程中的错误 在开发Java程序的过程中 会遇到各种各样的错误 一下是对错误的分类: 1.语法错误 如果产生了语法错误的话 那么就会导致编译失败 程序无法正常运行 2.逻辑错误 比如原本我想要进行加法运算 但是我将加法运算符写成了减法运算符 但是这个错误并不…

linux磁盘管理实验1

1.在安装好的linux系统中新加一块硬盘,将硬盘分成2个主分区,和2个逻辑分区,将其中一个逻辑分区设置成vfat(FAT32)分区,并实现开机自动挂载所有分区。 答:添加一个硬盘为sdb 分成2个主分区&#…

Ubuntu 本地部署 ChatGPT-Next-Web

Ubuntu 本地部署 ChatGPT-Next-Web 文章目录 Ubuntu 本地部署 ChatGPT-Next-Web ChatGPT-Next-Web 项目地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 本文主要演示如何在 Ubuntu 本地(默认是端口 3000)部署 ChatGPT-Next-Web&am…

FreeRTOS 实时操作系统第十二讲 - 计数信号量

一、信号量的概念 1、信号量的基本概念 消息队列是实现任务与任务或任务与中断间通信的数据结构,可类比裸机编程中的数组 信号量是实现任务与任务或任务与中断间通信的机制,可以类比裸机编程中的标志位 信号量 (semaphore) 可以实现任务与任务或任务与中…

【MATLAB源码-第105期】基于matlab的4PAM调制解调仿真,输出误码率和误符号曲线并且和理论值对比。

操作环境: MATLAB 2022a 1、算法描述 4PAM(4-Pulse Amplitude Modulation,4脉冲幅度调制)是一种数字调制技术,它通过改变载波信号的幅度来表示数据。在4PAM中,载波的幅度可以采用四种不同的水平&#xf…

Docker安装Centos8系统

引言:最小安装版Centos8系统安装docker软件安装记录 官网安装教程:https://dockerdocs.cn/engine/install/centos/index.html 操作系统镜像版本 CentOS-Stream-8-x86_64-latest-boot.iso 第一步:更新yum yum -y update第二步:…

H266/VVC环路滤波技术概述

环路滤波 环路滤波:是提高编码视频主客观质量的有效工具,不同于图像增强处理中的滤波技术,环路滤波是在视频编码过程进行滤波,滤波后的图像用于后续图像的编码,即位于“环路”中。 环路滤波的作用: 一方面…

【hcie-cloud】【17】华为云Stack灾备服务介绍【灾备方案概述、备份解决方案介绍】【上】

文章目录 前言灾备方案概述灾备的定义灾备的重要性故障和灾难对业务连续性带来的挑战灾备系统的衡量指标RTO与RPO分析 灾备等级标准数据中心容灾解决方案全景图云灾备服务总结架构华为云Stack灾备服务总览 备份解决方案介绍云备份服务介绍备份服务架构介绍云备份服务组件功能介…

标签函数 - 打造JavaScript组件

📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 &#x1f4…

vite 如何打包 dist 文件到 zip 使用插件 vite-plugin-zip-pack,vue3 ts

vite 如何打包 dist 文件到 zip 使用插件 vite-plugin-zip-pack,vue3 ts 开发过程中一个经常做的事就是将 ./dist 文件夹打包成 zip 分发。 每次手动打包还是很费劲的, vite 同样也有能把 ./dist 文件夹打包成 .zip 的插件,当然这个打包的文…

ubuntu 22 virt-manger(kvm)安装winxp; ubuntu22体验 firebird3.0

安装 、启动 virt-manager sudo apt install virt-manager sudo systemctl start libvirtdsudo virt-manager安装windowsXP 安装过程截图如下 要点1 启用 “包括寿终正寝的操作系统” win_xp.iso 安装过程 : 从winXp.iso启动, 执行完自己重启从硬盘重启&#xff0c…

09、docker 安装nacos并配置mysql存储配置信息

docker 安装nacos并配置mysql存储配置信息 1、docker启动nacos的各种方式2、Docker安装nacos3、MySQL中新建nacos的数据库4、挂载数据or配置目录5、运行 1、docker启动nacos的各种方式 内嵌derby数据源 docker run -d \ -e PREFER_HOST_MODEhostname \ -e SPRING_DATASOURCE_…

如何从 Android手机存储卡中恢复已删除的文件

作为 Android 用户,您可能会使用 存储卡来扩展手机的存储容量,并存储照片、视频和其他类型的文件。但意外发生时,您可能会错误地删除其中一些文件,或者由于其他原因而丢失它们。在大多数情况下,您可以通过主动并遵循正…

Microsoft Visual Studio 2022 install Project 下载慢

1. 关闭Internet 协议版本6 2. 如果没有效果,打开Internet 协议版本4,更改DNS 3. 在浏览器中下载后安装,下载地址如下: Microsoft Visual Studio Installer Projects 2022 - Visual Studio Marketplace 4. 安装时注意关闭vs&…

在Flyway执行数据库脚本之前创建数据库

Flyway让我们不用手动执行sql脚本,但是众所周知,前提是要先创建项目的数据库。为了能够让运维的同事再偷一次懒,通过代码来自动完成数据库的创建,于是有了这篇文章的分享~ 要实现这个效果,只需要两步: 第一…

Python基础(十九、文件操作写入与追加)

文章目录 一、文件的写入(使用 "w" 模式)二、文件的追加(使用 "a" 模式)三、文件备份案例接之前的答案 在 Python 中,open() 是一个内置函数,用于打开文件并返回文件对象。它是处理文件…

HTML的简单介绍

文章目录 1. HTML1.1 HTML 基础认识1.2 快速生成代码框架1.3 HTML 基础标签 1. HTML 1.1 HTML 基础认识 什么是HTML呢? HTML叫做超文本标记语言。超文本:例如图片,视频,文本,声音,表格,链接等…