Scrapy-redis组件,实现分布式爬虫
安装包
pip install -U scrapy-redis
settings.py
##### Scrapy-Redis #####
### Scrapy指定Redis 配置 ###
# 其他默认配置在scrapy_redis.default.py中。
# 指定redis类对象,如果你的是redis集群就要改一下。
# REDIS_CLS = redis.RedisCluster
# 看了一下源码,发现要通过这种方式才能指定redis集群的各个IP
# 当然了,你只指定集群中任意一个HOST、PORT也行(这时候就只要REDIS_HOST和REDIS_PORT即可,这点你看看源码就知道了..),因为集群会自动找响应的主机。
# 定义redis集群的Node节点信息
# 注意不一定要全部集群的节点信息都放在这里,因为RedisCluster只要求集群中其中一个节点即可!
# REDIS_CLUSTER_NODES = [
# {"host": "192.168.2.6", "port": 6379},
# {"host": "192.168.2.6", "port": 6380},
# {"host": "192.168.2.6", "port": 6381},
# {"host": "192.168.2.6", "port": 6382},
# {"host": "192.168.2.6", "port": 6383},
# {"host": "192.168.2.6", "port": 6384},
# ]
# nodes = []
# for node in REDIS_CLUSTER_NODES:
# nodes.append(ClusterNode(node["host"], node["port"]))
#
# REDIS_PARAMS = {
# 'startup_nodes': nodes,
# }
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# REDIS_URL = "redis://127.0.0.1:6379" # 用这种方式也行.
# REDIS_DECODE_RESPONSES = True
# REDIS_DB
# REDIS_ENCODING
# 启用Rides调度存储请求队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 不清除Redis队列、这样可以暂停/恢复 爬取
SCHEDULER_PERSIST = True
# 如果为True,则使用redis的'spop'进行操作。
# 如果需要避免起始网址列表出现重复,这个选项非常有用。开启此选项urls必须通过sadd添加,否则会出现类型错误。
REDIS_START_URLS_AS_SET = False
# 定义指纹去重过滤的类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# scrapy-redis对于请求的处理的调度有各种队列,如先进先出,后进先出,优先级队列(默认)
# 使用优先级调度请求队列 ["scrapy_redis.queue.SpiderQueue" 此项是先入先出队列]
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
爬虫类:(一般只需要将继承类修改为Scrapy-redis提供的爬虫类即可)
import time
import scrapy
from scrapy.http import HtmlResponse
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from zolwallpaper.items import Bang123Item
from scrapy_redis.dupefilter import RFPDupeFilter
# 将继承的类修改为RedisCrawlSpider、或者RedisSpider(看你的业务需求)
# class Bang123Spider(CrawlSpider):
**class Bang123Spider(RedisCrawlSpider):**
name = "bang123"
allowed_domains = ["bang123.cn"]
**# 使用scrapy-redis后就不需要指定start_urls,而是定义redis_key,在这个key里面将url地址push进去列表中,让多台机器tongshidu
# start_urls = ["https://www.bang123.cn/"]**
# 定义在redis启动的urls的key名,如果不设置,则默认为爬虫的名字+:start_urls,
# 比如Bang123Spider爬虫类的这里的name="bang123",那么也会组成bang123:start_urls,这些可以自己看源码。
# redis_key = "bang123:start_urls"
rules = (
# 翻页
Rule(LinkExtractor(allow=r"https://www.bang123.cn/index_\d+.html"), follow=True),
# 详情页
Rule(LinkExtractor(allow=r"https://www.bang123.cn/gongshi/\d+.html"), callback="parse_item", follow=False),
)
def parse_item(self, response: HtmlResponse):
bang_item = Bang123Item()
selector = response.xpath('//div[@class="article_content layui-field-box"]')[0]
title = selector.xpath('./h1/text()').get()
main = response.xpath('//div[@class="content tindent of_table"]/p').getall()
bang_item["title"] = title
bang_item["main"] = main
print(f"【{title=}】")
print(f"{main=}")
print("-"*150)
yield bang_item
启动爬虫:
scrapy crawl bang123
手动添加start_urls:
redis-cli>
# 这里key名字是你在爬虫类中定义的redis_key的值
redis-cli>lpush bang123:start_urls https://www.bang123.cn/
为什么需要手动添加呢?
1、因为我们这个是CrawlSpider,是根据Rule自动找链接的,所以我们需要先手动给他一个链接。
这个在官方文档也有写:https://github.com/rmax/scrapy-redis/wiki/Feeding-a-Spider-from-Redis
当然了,你也可以写两个爬虫,一个爬虫负责获取分页中每个项目的url,并发送到redis-key对应的start_urls中。
另外一个爬虫则负责爬取详情页,这种方法也可以。
Scrapy-redis组件,实现分布式爬虫的更多相关文章
- 基于scrapy-redis组件的分布式爬虫
scrapy-redis组件安装 分布式实现流程 scrapy-redis组件安装 - 下载scrapy-redis组件:pip install scrapy-redis - 更改redis配置文件: ...
- 基于redis的简易分布式爬虫框架
代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...
- Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合
简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...
- python3下scrapy爬虫(第十三卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之配置)
之前我们的爬虫都是单机爬取,也是单机维护REQUEST队列, 看一下单机的流程图: 一台主机控制一个队列,现在我要把它放在多机执行,会产生一个事情就是做重复的爬取,毫无意义,所以分布式爬虫的第一个难点 ...
- Python 用Redis简单实现分布式爬虫
Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台. 连接数据库 注意:假设现有几台在同一局域网内的机器分别为Master和几个Slaver Master连接 ...
- python3下scrapy爬虫(第十四卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之执行)
现在我们现在一个分机上引入一个SCRAPY的爬虫项目,要求数据存储在MONGODB中 现在我们需要在SETTING.PY设置我们的爬虫文件 再添加PIPELINE 注释掉的原因是爬虫执行完后,和本地存 ...
- 16 Scrapy之分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- Python36 使用Redis 构建分布式爬虫(未完)
很长时间未更新了,人懒了. 最近有不少的东西,慢慢写吧,最近尝试了一下python 使用Redis 来构建分布式爬虫: 单体爬虫有很多缺点,但是在学习过程中能够学习爬虫的基本理念与运行模式,在后期构建 ...
- 基于scrapy-redis的分布式爬虫
一.介绍 1.原生的scrapy框架 原生的scrapy框架是实现不了分布式的,其原因有: 1. 因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- 基于scrapy-redis分布式爬虫的部署
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
随机推荐
- 蚂蚁集团混沌工程 ChaosMeta V0.5 版本发布
混沌工程 ChaosMeta 的全新版本 V0.5 现已正式发布!该版本包含了许多新特性和增强功能,为用户提供了支撑混沌工程各个阶段的平台能力,以及降低使用门槛的用户界面. ChaosMeta V0. ...
- sqoop1.4.7完全支持Hadoop3.x, Hive3.x Hbase2.x
已经修改好 保存至云盘 自己下载 花了时间的,记得关注我... 链接:https://pan.xunlei.com/s/VNe6P6Tm1A9Q-RG5GByN08rdA1# 提取码:5nke 复制这 ...
- KRPANO资源分析工具下载网展全景图
示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师官 ...
- python入门基础(14)--类的属性、成员方法、静态方法以及继承、重载
上一篇提到过类的属性,但没有详细介绍,本篇详细介绍一下类的属性 一 .类的属性 方法是用来操作数据的,而属性则是建模必不的内容,而且操作的数据,大多数是属性,比如游戏中的某个boss类,它的生命值就是 ...
- Linux升级至glibc-2.14步骤
Linux升级至glibc-2.14步骤 查看gcc版本命令: strings /lib64/libc.so.6 |grep GLIBC_ glibc安装 首先, 点击此处下载glibc2.14下载, ...
- C++指针和地址偏移在HotSpot VM中的应用
在前面我们介绍过new运算符,这个操作实际上上包含了如下3个步骤: 调用operator new的标准库函数.此函数会分配一块内存空间以便函存储相应类型的实例. 调用相应类的构造函数 返回一个指向该对 ...
- 洛谷题解 | AT_abc321_c Primes on Interval
目录 题目翻译 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 样例 #3 样例输入 #3 样例输出 #3 题目简化 题目思路 A ...
- destoon上做纯js实现html指定页面导出word
因为最近做了范文网站需要,所以要下载为word文档,如果php进行处理,很吃后台服务器,所以想用前端进行实现.查询github发现,确实有这方面的插件. js导出word文档所需要的两个插件: 1 2 ...
- 2023_10_09_MYSQL_DAY_01_笔记
2023_10_09_MYSQL_DAY_01 #运算符的优先级 SELECT ename, job, sal FROM emp WHERE ( job='SALESMAN' OR job='PRES ...
- Windows下SVN服务端(Subversion)及客户端(TortoiseSVN)详细安装教程
1. Subversion和TortoiseSVN 是什么? http://www.uml.org.cn/pzgl/200811146.asp Subversion 是什么,我想如果不知道的话就没有必 ...