scrapy--伪分布式redis操作

news2024/11/13 21:29:30

免责声明:本文仅做分享...

目录

scrapy分布式爬虫

伪分布式

redis

快速学习使用

字 符 串 类 型

列 表 类 型

 hash 类型

set 类型

zset  类型

小结:

 scrapy-redis

安装第三方库:

settings.py配置:

spider文件修改:

redis数据库添加 键 值

启动

scrapy总结


scrapy分布式爬虫

分布式: 需要搭建一个分布式的机群,让机群中的每一台电脑去执行同一组程序,对同一组资源进行联合且分布的数据爬取.

多台电脑同时工作,更快的完成任务,即是其中一台电脑出问题了,其它电脑还能继续工作, 任务不会因此而终止.

如果多个项目(多台电脑有相同的项目)同时访问一个url,数据是不会共享的,就意味着三个项目爬取到的是所有 的数据,重复三份。有时候想要进行提高效率.

原来的scrapy框架无法实现分布式:

调度器是独有的(一个项目一个调度器),没有办法实现共享. 

 可以让多个相同项目启动时,爬取到的数据不重复,最终只需要一份总数据就可以了.


--更快, 更强 .

选择使用reids作为共享调度器,实现分布式的任务共享!!!

伪分布式

一台电脑, 多个终端, 跑相同的项目.

redis

select 索引(有16个库,0-15代表索引,不执行这条语句就是0)

5大数据类型.

自己安装

快速学习使用

http://t.csdnimg.cn/vBzAk


字 符 串 类 型


列 表 类 型


 hash 类型

购物车的数据,

hash类型:
键 值
   字段和值
user username coco age 18

添加数据
hset 键 字段 值
hset user username coco
hset user age 18
查询
hget 键 字段

根据键查询所有字段
hkeys 键
根据键查询所有字段得的值
hvals 键

删除某个键的某个字段

hdel 键 字段【可选多个】
nil 空:None null

添加多个
hmset 键 字段名 值 字段名 值 【可以作为追加,也可以一次添加一个,也可以一次添加多个】
获取多个
hmget 键 字段名 【可选多个】

hlen 键


set 类型

set类型 集合(无序且唯一)

添加数据
sadd 键 值1 值2 值3

查询数据
smembers 键

删除数据(随机删除)
spop 键 【个数】

指定删除数据
srem 键 指定数据【可以同时删除多个数据】

求交集 :获取两个键中相同的值
sinter 键1 键2

求并集:获取两个键中的所有值(重复的只保留一个)
sunion 键1 键2

求差集:
sdiff 键1 键2


 

zset  类型

 Sorted Set  (有序~)

set和hash的结合体 都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Set中的每一个成员都会有一个分数(score)与 之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。Sorted-Set中的成员必须是唯一的,但是分数

(score)却是可以重复的.


有顺序的集合类型
zset(set+hash的结合体)

添加数据
zadd 键 分数 数据 分数 数据
zadd zs1 11 11

获取所有数据,显示数据的顺序是按照分数值从小到大进行排序
zrange 键 开始索引 结束索引

分数值从大到小排序
zrevrange 键 开始索引 结束索引

通过分数值查询范围
zrangebyscore 键 最小 最大

查询指定分值范围的数据个数
zcount 键 最小 最大

查看某个数据的分值
zscore 键 分数对应的数据


删除数据
zrem 键 分数对应的数据


小结:

5大数据类型结构:

字符串:1: 1
列表:1: 1 2 3 4
哈希:1: 字段:2 2:3
集合:1: 1 2 3 4
有序集合: 1: 分数:2 2:3


 scrapy-redis

scrapy-redis:可以给原本的scrapy框架提供共享的调度器.

安装第三方库:

pip install scrapy-redis

settings.py配置:

ip 为 redis 服务的.

# 指定连接的redis数据库的ip地址和端口号.
REDIS_URL = "redis://127.0.0.1:6379"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 开启redis的持久化.
SCHEDULER_PERSIST = True
REDIS_URL = 'redis://127.0.0.1:6379' # 连接redis
#或者

# REDIS_HOST = '127.0.0.1'
# REDIS_PORT = 6379
# 指定去重方式 给请求对象去重

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"    # 指定那个去重方法给request对象去
重

# 设置公共调度器

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

SCHEDULER_PERSIST = True  

spider文件修改:

如果要使用scrapyredis

原本spider继承的是CrawlSpider,需要更改为RedisCrawlSpider

原本spider继承的是Spider,需要更改为RedisSpider


    注释allowed_domains , start_urls


    定义:redis_key='保存到redis的键'


redis数据库添加 键 值

开启redis服务, 执行命令:

127.0.0.1:6379> lpush xj https://www.xjie.edu.cn/tzgg1.htm
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> lrange xj 0 -1
1) "https://www.xjie.edu.cn/tzgg1.htm"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "111"
2) "xj:dupefilter"
3) "key"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> del xj:dupefilter
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "111"
2) "key"
127.0.0.1:6379>

爬完后会生成目标url的指纹 , 以后就不再爬取.

--如果下一次要重新爬,就要删除此指纹.  del xj:dupefilter


启动

开终端  -- >  scrapy crawl xj

 


数据解析时 yield item 对象, 由管道自定义保存.

--保存方式 该怎么写怎么写 ~


scrapy总结

'''

如何创建scrapy
scrapy startproject 项目名

cd 项目名

scrapy genspider 爬虫名 爬虫名.com

执行爬虫

scrapy crawl 爬虫名
流程:

1= 改动settings.py
   USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 
like Gecko) Chrome/125.0.0.0 Safari/537.36'
   ROBOTSTXT_OBEY = False # 不遵循

   LOG_LEVEL = 'ERROR'
2= 改动spider下的爬虫名.py
   class BaiduSpider(scrapy.Spider):
         name = "baidu" # 爬虫的名字

         # allowed_domains = ["baidu.com"] # 允许的域名

         start_urls = ["请求url"]
scrapy启动之后,引擎会从spider获取start_url 自动发起请求。
最后请求成功,得到响应对象叫给了spider类的parse方法

       def parse(self, response): # response为响应对象

           二进制数据

           response.content
           json数据

           response.json()
           html源代码数据

           response.text
           如果是二进制数据,直接保存
           如果是json数据,先通过字典的操作获取到想要的数据值

           如果是 html源代码,先通过xpath的操作获取到想要的数据值

           response.xpath(’xpath表达式‘).get() 获取对象的data属性值 url
           response.xpath(’xpath表达式‘).getall() 返回的是一个列表,[url]
3= 基于管道保存

   1- 解析出来数据(实际要保存的数据)

   2 -在items.py创建一个类 类中的属性为

       数据名 = scrapy.Field()
   3- 解析数据的位置创建 items类型对象,再通过字典的操作把数据存入

       items = items对象

       items[数据名] = 数据值

   4- yield items 把items对象提交给管道

   5- 在pipelines.py中创建管道类。编写对应的保存代码吧数据进行保存

       1- 保存到文本文件中

       2- 保存到excel中

       3- 保存到mysql中

       open_spider: 爬虫开启的时候执行 只执行一次

           打开文件

           创建数据库连接

           创建工作簿

       process_item: 只要yield一条数据,就执行一次

           执行代码保存的

           写入

           insert
           append
       close_spider:爬虫结束的时候执行 只执行一次

           关闭文件

           关闭连接

           保存文件

4= 需要在settings中开启管道
管道类可以同时设置多个,一份数据可以保存到文本文件 可以保存到数据库 保存到excel

只需要设置一个优先级数字,数字越小优先级越大。
如果设置了多个管道,在管道类中process_item方法中加入return 把数据再返回给下一个管道
分页,详情页
结合手动发起请求

 1- 把当前得到的分页url或者详情页url 交给yield scrapy.Request(url=请求的url,callback=回调方
法,meta={'item':item})
 在回调方法中写的就是针对分页url或者详情页的url 进行数据解析

2- 把得到的url存入start_urls中,这样就不需要手动发起请求,自动发起。解析方法是parse

配合spider类的子类Crawlspider
 spider类继承crawlspider
指定连接提取器

   rules = (Rule(LinkExtractor(allow=r'正则匹配'), callback="回调方法", follow=False),
             Rule(LinkExtractor(allow=r'正则匹配'), callback="回调方法", follow=True)
             )
follow

为True 设置继续追踪
为False 设置不追踪
中间件:

   篡改请求或者响应

scrapy-redis:

   分工协作,共同抓取同一份数据

1- settings.py
   # 指定调度器 存储到redis
   SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
   # 确保所有spider通过redis共享相同的重复过滤器

   DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
   # 指定redis连接

   REDIS_URL = 'redis://127.0.0.1:6379'
2- 改动spider
   继承改动

   把start_urls去掉

   加入redis_key = 键

3- 去redis中加入列表数据

   lpush 键 请求的url

测试scrapy-redis

注意顺序,先去redis添加 再执行scrapy

 

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

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

相关文章

IS-IS路由配置--路由聚合

目录 不熟悉和理解IS-IS动态协议的可以回顾IS-IS详解,IS-IS相关的实验都不再做过多的解释 一. 实验拓扑 二. 实验配置 不熟悉和理解IS-IS动态协议的可以回顾IS-IS详解,IS-IS相关的实验都不再做过多的解释 IS-IS路由原理详解https://blog.csdn.net/23…

js Object.keys--filter 遍历对象中的数组,排查为空字段

Object.keys(filter).forEach(function(key) { if(key filters){ filter[key] filter[key].filter((item) > item.tagName ! "") } });

CTF—杂项学习

1 文件操作隐写 1.1 文件类型识别 1.1.1 File命令 当文件没有后缀名或有后缀名而无法打开时,根据识别出的文件类型来修改后缀名即可正常打开文件,file是Linux下的文件识别命令。 file 文件名 使用场景:不知道后缀名,无法打开文件…

低代码技术在业务流程自动化中的应用与挑战

在数字化转型的浪潮中,低代码平台和业务流程自动化(BPA)成为了企业提升效率和灵活性的关键工具。今天,我们将探讨低代码技术如何推动BPA的实施,及其带来的挑战和解决方案。 低代码技术概述 低代码平台是现代软件开发的…

HR告诉你:PMP证书到底是职场神话还是锦上添花?真相大解析!

HR在评价PMP证书时,需要根据招聘要求来考量。目前大多数项目管理岗位都要求应聘者“持有PMP等相关证书优先考虑”,简而言之:PMP证书就像是敲门砖。 对于大多数人而言,拥有PMP证书意味着有机会获得面试机会。毕竟在项目管理领域&a…

ASO优化之如何准确定位目标用户

如今应用商店中APP层出不穷,市场那么大,用户的需求也是各种各样,那么怎么才能用ASO优化来准确的定位目标用户呢,以下是一些关键策略和方法,用于实现这一目标: 1. 深入市场与用户研究 市场趋势分析&#x…

企业级数据库 DevOps 最佳实践,通过 NineData 实现高效安全的数据库开发

第15届中国数据库技术大会(DTCC2024)于8月22日-24日在北京隆重召开,本次大会由 IT168 联合旗下 ITPUB、ChinaUnix 两大技术社区主办。玖章算术 NineData 受邀首次参展,并由 NineData 联合创始人周振兴发表了《企业级数据库 DevOps…

乾元通渠道商中标湖南省煤业集团公司安全生产预防和应急救援能力建设装备配备采购项目

近日,乾元通渠道商中标湖南省煤业集团安全生产预防和应急救援能力建设装备配备采购项目,乾元通作为聚合通讯保障技术厂家,为项目一标段卫星通讯指挥车提供车载聚合路由器终端及系统。 乾元通经过多年发展,逐步建起车载系列多链路聚…

minio创建用户并访问指定的bucket

目录 bucket的命名规则一、创建权限1、参数含义2、示例,实现读写test, 读test2目录但无下载权限3、自己新建的权限 二、创建用户并关联权限三、用新用户登录四、mc命令1、mc安装用docker容器运行直接安装在操作系统 2、mc配置mc配置文件查看mc配置mc alias list查看…

力扣题/回溯/电话号码的字母组合

电话号码的字母组合 力扣原题 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digi…

iOS/iPadOS18.1Beta3发布,新增通知摘要和AI消除功能

除了iOS/iPadOS18 Beta8,苹果今天一同推送的还有iOS/iPadOS 18.1开发者预览版Beta 3!iOS/iPadOS18.1Beta3的内部版本号为22B5034e,距离上次发布Beta/RC间隔8天。 依旧是仅针对支持Apple Intelligence的iPhone 15 Pro和iPhone 15 Pro Max两款…

Can‘t set custom OpenAI model with langchain on nodejs

题意:"无法在 Node.js 中使用 LangChain 设置自定义 OpenAI 模型" 问题背景: I am trying to set "gpt-3.5-turbo" model in my OpenAI instance using langchain in node.js, but below way sends my requests defaultly as text-…

个人信息保护专业人员(CCRC-PIPP)助力企业数据要素合规有序流通

在当今数字化时代,个人信息作为企业不可或缺的数据资产,其合规管理与高效流通变得尤为重要。 组织须采纳必要措施保护用户信息,同时确保遵循相关法规要求。 为此,中国网络安全审查认证和市场监管大数据中心推出了个人信息保护专…

Java:简述类的加载机制-初始化

Java:普通代码块,构造代码块,静态代码块区别及其执行顺序 类加载的机制过程分为以下:加载、验证、准备、解析、初始化等。 本文主要分析类的初始化过程。 类的初始化阶段,是真正开始执行类中定义的java程序代码(.cla…

成都电工培训优惠报名在哪里?

如何获取优惠抵扣? 一、关注特殊群体优惠 农民工优惠:部分地区或培训机构会针对农民工群体提供培训费用的减免或优惠,具体政策需咨询当地培训机构或相关部门。 退伍军人优惠:退伍军人作为特殊群体,在参加职业技能培训…

考研系列-408真题数据结构篇(10-17)

写在前面 此文章是本人在备考过程中408真题数据结构部分(2010年-2017年)的易错题及相应的知识点整理,后期复习也尝尝用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2010年 1.散列表处理冲突…

CAN Intel格式与Motorola格式的区别

在CAN(Controller Area Network)通信中,CAN报文的编码格式对于数据的有效传输和准确解析至关重要。CAN报文的编码格式主要包括Intel格式和Motorola格式。尽管这两种格式在单个字节内部的数据表示上是一致的,但在处理跨字节数据时&…

uniapp微信小程序开发测试获取手机号码

先申请测试号 注意认证但是没有完全认证不要试测试号解密如下 总结我自己的两大坑 1.官网的WXBizDataCrypt需要导入crypto要提前下载但是试了很多次没有效果重新编写这个。将crypto库换成crypto-js库 2.我一直在尝试用下有下面这个界面的测试号不行获取不到用户的code还是啥忘记…

CSS系列之Float浮动(二)

一、传统网页布局 网页布局的本质:用 CSS 来摆放盒子,把盒子摆放到相应位置。CSS 提供了三种传统布局方式(这里指的只是传统布局,其实还有一些特殊高级的布局方式): 标准流浮动定位 1、所谓的标准流&#…

美团高级测试面试700题汇总:软测+MySQL+Liunx+Python+自动化等

前言 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。 今天给大家分享下我整理的BAT软件测试面试专题及答案,其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了&#xff…