Python3 爬虫 Scrapy 与 Redis

        Scrapy是一个分布式爬虫的框架,如果把它像普通的爬虫一样单机运行,它的优势将不会被体现出来。因此,要让Scrapy往分布式爬虫方向发展,就需要学习Scrapy与Redis的结合使用。Redis在Scrapy的爬虫中作为一个队列存在。

一、Scrapy_redis的安装和使用

        Scrapy自带的待爬队列是deque,而现在需要使用Redis来作为队列,所以就需要将原来操作deque的方法替换为操作Redis的方法。但是,如果要把三轮车换成挖掘机,驾驶员也必须从三轮车驾驶员换成挖掘机驾驶员。Scrapy_redis在这里就充当驾驶员的角色。更准确地说,Scrapy_redis是Scrapy的“组件”,它已经封装了使用Scrapy操作Redis的各个方法。
Windows、Linux和Mac OS都可以在CMD或者终端中使用pip安装Scrapy_redis:

pip install scrapy_redis

        Scrapy_redis本身非常小,但是由于pip会自动安装依赖,所以它会去检查Scrapy和相关的依赖库是否已经安装。如果已经安装了,会提示需求已经满足(Requirement already satisfied),不会重复安装。

        使用Redis缓存网页并自动去重
        由于Scrapy_redis已经封装了大部分的流程,所以我们使用它不会有任何难度。

1. 启动Redis
        首先需要把Redis启动起来。对于Mac OS/Linux系统,直接在终端下面输入以下命令并按Enter键:

redis-server

        在Windows系统中,通过CMD的cd命令进入存放Redis的文件夹,并运行:

redis-server.exe

2. 修改爬虫
        在前面的代码中,爬虫继承自scrapy.Spider这个父类。这是Scrapy里面最基本的一个爬虫类,只能实现基本的爬虫功能。现在需要把它替换掉,从而实现更高级的功能。
        首先需要导入支持Redis的爬虫父类并使用:

from scrapy_redis.spiders import RedisSpiderclass Exercise114Spider(RedisSpider): name = "exercise11_4"redis_key = 'exercise114spider:start_urls'…

        请对比上面这段使用了Scrapy_redis的代码与前面例子中爬虫的代码头部有什么不同。
可以看出,这里爬虫的父类已经改成了RedisSpider,同时多了以下内容:

redis_key = 'exercise114spider:start_urls'

        这里的redis_key实际上就是一个变量名,之后爬虫爬到的所有URL都会保存到Redis中这个名为“exercise114spider:start_urls”的列表下面,爬虫同时也会从这个列表中读取后续页面的URL。这个变量名可以任意修改,里面的英文冒号也不是必需的。不过一般习惯上会写成“爬虫名:start_urls”这种形式,这样看到名字就知道保存的是什么内容了。
        除了导入的类和redis_key这两点以外,爬虫部分的其他代码都不需要做任何修改。原来解析XPath的代码可以正常工作,原来保存数据到MongoDB的代码也可以正常工作。
实际上,此时已经建立了一个分布式爬虫,只不过现在只有一台计算机。

3. 修改设置
        现在已经把三轮车换成了挖掘机,但是Scrapy按照指挥三轮车的方式指挥挖掘机,所以挖掘机还不能正常工作。因此修改爬虫文件还不行,Scrapy还不能认识这个新的爬虫,还需要修改settings.py。

(1)Scheduler
        首先是调度Scheduler的替换。这是Scrapy中的调度员。在settings.py中添加以下代码:

# Enables scheduling storing requests queue in redis. 
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

(2)去重

# Ensure all spiders share same duplicates filter through redis. 
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

        设置好上面两项以后,爬虫已经可以正常开始工作了。不过我们还可以多设置一些东西使爬虫更好用。

(3)爬虫请求的调度算法
        爬虫请求的调度算法,有3种情况可供选择。

① 队列

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'

        如果不配置调度算法,默认就会使用这种方式。它实现了一个先入先出的队列,先放进Redis的请求会优先爬取。

② 栈

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'

        这种方式,后放入到Redis的请求会优先爬取。

③ 优先级队列

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'

        这种方式,会根据一个优先级算法来计算哪些请求先爬取,哪些请求后爬取。这个优先级算法比较复杂,会综合考虑请求的深度等各个因素。
        在实际爬虫开发过程中,从以上3项中选择一种并写到settings.py中即可。

(4)不清理Redis队列

# Don't cleanup redis queues, allows to pause/resume crawls. 
SCHEDULER_PERSIST =True

        如果这一项为True,那么Redis中的URL不会被Scrapy_redis清理掉。这样的好处是,爬虫停止了再重新启动,它会从上次暂停的地方开始继续爬取。
        如果设置成了False,那么Scrapy_redis每一次读取了URL以后,就会把这个URL删除。爬虫暂停以后再重新启动,它会重新开始爬。
        由于现在的爬虫和Redis在同一台计算机上面运行,所以可以不需要配置Redis的信息。Scrapy_redis会默认Redis就运行在现在这台计算机上,IP和端口也都是默认的127.0.0.1和6379。如果Redis不在本地的话,就需要将它们写出来:

REDIS_HOST = '127.0.0.1' #修改为Redis的实际IP地址 
REDIS_PORT = 6379 #修改为Redis的实际端口

二、Scrapy 小结 

        Scrapy在Windows中的安装最为烦琐,在Mac OS中的安装最为简单。由于Scrapy需要依赖非常多的第三方库文件,因此建议无论使用哪个系统安装,都要将Scrapy安装到Virtualenv创建的虚拟Python环境中,从而避免影响系统的Python环境。
        使用Scrapy爬取网页,最核心的部分是构建XPath。而其他的各种配置都是一次配好、终生使用的。由于Scrapy的理念是将数据抓取的动作和数据处理的动作分开,因此对于数据处理的各种逻辑应该让pipeline来处理。数据抓取的部分只需要关注如何使用XPath提取数据。数据提取完成以后,提交给pipeline处理即可。
        由于Scrapy爬虫爬取数据是异步操作,所以从一个页面跳到另一个页面是异步的过程,需要使用回调函数。
        Scrapy爬取到的数据量非常大,所以应该使用数据库来保存。使用MongoDB会让数据保存工作变得非常简单。要让Scrapy使用MongoDB,只需要在pipeline中配置好数据保存的流程,再在settings.py中配置好ITEM_PIPELINES和MongoDB的信息即可。
        使用Redis做缓存是从爬虫迈向分布式爬虫的一个起点。Scrapy安装scrapy_redis组件以后,就可以具备使用Redis的能力。在Scrapy中使用Redis需要修改爬虫的父类,需要在settings.py中设置好爬虫的调度和去重。同时对于Python 3,需要修改scrapy_redis的一行代码,才能让爬虫正常运行。

 --------------------------------------

没有自由的秩序和没有秩序的自由,同样具有破坏性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 学习

Docker 学习 Docker 概念 Docker 安装 一般是在服务器里 Docker阿里云镜像加速 配置主要是Linux命令 Docker命令大纲及帮助文档的使用 docker帮助文档 查看docker命令 docker --help查看某个命令,例如ps的详细文档 docker ps --help也可查阅 [docker官方帮助手…

超牛免费 机械臂模型、工业机器人模型下载网站集合

‌机械臂是一种高精度、多输入多输出的复杂系统,能够模仿人手的动作,按照给定程序、轨迹和要求实现自动抓取、搬运等功能‌。它通常由执行机构、驱动装置、控制系统以及传感器等组成,能够完成各种复杂的动作。‌ 机械臂在工业、医学、娱乐、…

【Python技术】同花顺wencai涨停分析基础上增加连板分析

周末,有读者加我, 说 之前的涨停分析 是否可以增加连板分析。 这个可以加上。 先看效果 这里附上完整代码: import streamlit as st import pywencai import pandas as pd from datetime import datetime, timedelta import plotly.graph_o…

小程序子组件调用父组件方法、父组件调用子组件方法

1、子组件调用父组件方法 子组件this.triggerEvent(finish); startShare(e) {let url config.apiUrl "/business/lzShare/edit";let data this.data.currentData;util.httpPut(url, data).then((res) > {this.triggerEvent(finish);console.log(res.result);})…

怎样使用Eclipse创建Maven的Java WEB 项目

文章目录 1、第一种方式(选择 archetype 方式) 1.1、第一步:创建项目1.2、第二步:配置jre1.3、第三步:配置tomcat1.4、第四步:设置为WEB3.11.5、第五步:配置Maven的编译级别 1.5.1、第一种方法…

C语言刷题

1. 题目描述 根据给出的三角形3条边a:b.c(a.b,c<100.000)&#xff0c;计算三角形的周长和面积。 输入描述: 一行&#xff0c;三角形3条边(能构成三角形)&#xff0c;中间用一个空格隔开. 输出描述: 一行&#xff0c;三角形周长和面积保留两位小数&#xff0c;中问用一个空…

C语言动态内存管理【进阶--5--】

文章目录 [toc] 动态内存管理一、作用即意义二、动态内存函数的介绍Ⅰ、malloc()函数、free()函数Ⅱ、calloc()函数Ⅲ、realloc()函数 三、常见的动态内存错误Ⅰ、对NULL指针的解引用操作Ⅱ、对动态开辟空间的越界访问Ⅲ、对非动态开辟的内存使用free释放Ⅳ、使用free释放动态开…

Python学习(三)—— 基础语法(下)

目录 一&#xff0c;函数 二&#xff0c;列表和元组 2.1 列表基础操作 2.2 切片 2.3 列表的增删查改 2.4 连接链表 2.5 元组 三&#xff0c;字典 3.1 关于字典 3.2 字典的增删查改操作 3.3 遍历字典元素 3.4 合法的key类型 四&#xff0c;文件操作 4.1 打开关闭…

【数据分享】2014-2024年我国POI兴趣点数据(免费获取/来源于OSM地图)

POI是Point of Interest的简称&#xff0c;意为“兴趣点”&#xff0c;是互联网电子地图中用于表示特定位置的地理实体的核心数据类型。POI通常用于标注具体地点&#xff0c;例如餐厅、商场、学校、医院、景点等。这些数据以点的形式呈现&#xff0c;并附带详细属性信息&#x…

执行python时报错SyntaxError: Non-UTF-8 code

执行python时报错SyntaxError: Non-UTF-8 code starting with ‘\xb4’ in file sqlite_insert.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 通过对文件增加编码格式进行解决。 codingutf-8 codingutf-8 import sqlite…

三、前端学习——HTML表格创建与编辑

1 先看一段代码 css代码如下所示&#xff1a; /* 定义表格整体的宽度、边框样式和间距 */ table {width: 100%; /* 设置表格占据100%宽度 */border-collapse: collapse; /* 合并表格边框 */margin-top: 30px; /* 设置表格与上方元素的间距 */ }/* 定…

电子应用设计方案-52:智能电子相框系统方案设计

智能电子相框系统方案设计 一、引言 智能电子相框作为一种能够展示数字照片和多媒体内容的设备&#xff0c;为用户提供了便捷、个性化的照片展示方式。本方案旨在设计一款功能丰富、用户体验良好的智能电子相框系统。 二、系统概述 1. 系统目标 - 高质量显示照片和视频&#…

tomcat优化和动静分离

tomcat的优化和动静分离 tomcat的优化&#xff1a; 默认的安装情况下&#xff0c;tomcat经常会假死的情况 tomcat需要进行优化 优化的三个方面&#xff1a; 1、tomcat的配置优化2、操作系统的内核优化3、jvm调优 tomcat自身的优化&#xff1a; 8080&#xff1a;tomcat对外提供…

360quake导出工具

360Quake 查询工具 一个基于 PyQt6 开发的 360 Quake 网络空间测绘引擎查询工具&#xff0c;提供了简单直观的图形界面&#xff0c;支持多种数据导出格式。 功能特点 现代化的图形用户界面支持大规模数据查询&#xff08;最多100,000条结果&#xff09;实时查询进度显示多种…

东方通TongWeb替换Tomcat的踩坑记录

一、背景 由于信创需要&#xff0c;原来项目的用到的一些中间件、软件都要逐步替换为国产品牌&#xff0c;决定先从web容器入手&#xff0c;将Tomcat替换掉。在网上搜了一些资料&#xff0c;结合项目当前情况&#xff0c;考虑在金蝶AAS和东方通TongWeb里面选择&#xff0c;后又…

UE5中实现Billboard公告板渲染

公告板&#xff08;Billboard&#xff09;通常指永远面向摄像机的面片&#xff0c;游戏中许多技术都基于公告板&#xff0c;例如提示拾取图标、敌人血槽信息等&#xff0c;本文将使用UE5和材质节点制作一个公告板。 Gif效果&#xff1a; 网格效果&#xff1a; 1.思路 通过…

Cisco Packet Tarcer配置计网实验笔记

文章目录 概要整体架构流程网络设备互连基础拓扑图拓扑说明配置步骤 RIP/OSPF混合路由拓扑图拓扑说明配置步骤 BGP协议拓扑图拓扑说明配置步骤 ACL访问控制拓扑图拓扑说明配置步骤 HSRP冗余网关拓扑图拓扑说明配置步骤 小结 概要 一些环境配置笔记 整体架构流程 网络设备互连…

QTreeView 与 QTreeWidget 例子

1. 先举个例子 1班有3个学生&#xff1a;张三、李四、王五 4个学生属性&#xff1a;语文 数学 英语 性别。 语文 数学 英语使用QDoubleSpinBox* 编辑&#xff0c;范围为0到100,1位小数 性别使用QComboBox* 编辑&#xff0c;选项为&#xff1a;男、女 实现效果&#xff1a; 2…

渗透测试---wireshark(1)基本介绍与安装

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 视频地址&#xff1a;泷羽---wiresh…

AI开发 - 用GPT写一个GPT应用的真实案例

就在昨天&#xff0c;我的同事推荐给我了一个第三方的公共大模型API&#xff0c;这个API集合了国际上上几乎所有知名的大模型&#xff0c;只需要很少的费用&#xff0c;就可以接入到这些大模型中并使用它们。成本之低&#xff0c;令人乍舌&#xff01;包括我们现在无法试用的 G…