scrapy-redis 构建分布式爬虫,此片文章有问题。不要用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 此篇文章为转载,只供学习,有很多问题,如没有解决分布式去重问题。最好还是用scrapy-redis给出的例子代码 前言 scrapy是Python界出名的一个爬虫框架。Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘。有

此篇文章为转载,只供学习,有很多问题,如没有解决分布式去重问题。最好还是用scrapy-redis给出的例子代码

前言

scrapy是Python界出名的一个爬虫框架。Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘。有能人改变了scrapy的队列调度,将起始的网址从start_urls里分离出来,改为从Redis读取,多个客户端可以同时读取同一个redis,从而实现了分布式的爬虫。就算在同一台电脑上,也可以多进程的运行爬虫,在大规模抓取的过程中非常有效。

准备

既然这么好能实现分布式爬取,那都需要准备什么呢?
需要准备的东西比较多,都有:
- scrapy
- scrapy-redis
- redis
- MySQL
- python的mysqldb模块
- python的redis模块
为什么要有mysql呢?是因为我们打算把收集来的数据存放到mysql中

1. scrapy安装

pip install scrapy
AI 代码解读

也可以clone下相应的github地址https://github.com/scrapy/scrapy/tree/1.1

2. scrapy-redis安装

pip install scrapy-redis
AI 代码解读

同样可以clone下相应的github地址https://github.com/rolando/scrapy-redis
他俩具体有什么区别呢?https://www.zhihu.com/question/32302268/answer/55724369有知乎大神的回答

3.redis

redis本身只提供了在类Linux环境中安装,不支持windows,官网http://redis.io/,如果需要在windows下做练习的朋友,可以参考我的这篇http://blog.csdn.net/howtogetout/article/details/51520254

4.mysql

因为我们打算用mysql来存储数据,所以mysql的配置是不可或缺的。下载地址http://dev.mysql.com/downloads/

5.mysqldb模块和redis模块

为什么需要这2个呢,是因为python不能直接操作数据库,需要通过库来支持。而这2个就是相应数据库的支持库。
mysqldb:https://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/,windows环境下可以直接下.exe来快速安装
redis:

pip install redis

这样就是最简单的了。

动工

先来看下scrapy-redis的一些不同的地方。
scrapy1-redis
首先就是class的父对象变了,变成了特有的RedisSpider,这是scrapy-redis里面自己定义的新的爬虫类型。其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis将key从list中pop出来成为请求的url地址。

我们这次选取的对象是58同城的平板电脑信息。

首先来看一下架构信息。
58.1
scrapy.cfg文件我们可以不管,readme.rst文件也不管(这个是github上有用的,scrapy创建项目的时候并没有)
pbdnof58文件夹内的结构:
58.2
items定义文件,settings设置文件,pipelines处理文件以及spiders文件夹。
spiders文件夹盛放着我们编写的具体爬虫:
58.3
可以看到里面有2个爬虫,一个是用来爬所有的url地址,并将其传递给redis。而另外一个则是根据爬取出来的地址处理具体的商品信息。

具体来看。首先是settings.py文件。
settings1
跟scrapy一样,写明spider的位置。
pipeline
2个处理数据的pipeline中的类,数字越小优先执行。
mysql
因为数据要存放在mysql中,所以需要配置下mysql的信息。而redis是默认采用本地的,所以并没有配置信息,如果是连接别的主机的话,需要配置下redis的连接地址。
item.py文件
item
与scrapy相比多了个调度文件,多了个ItemLoader类,照着做就好了,ItemLoader类后面会用到的。
pipeline.py文件
mysqlpipe
最重要的是这个将结果存储到mysql中。
要在一个名为qcl的数据库之中建一个名叫58pbdndb的表。qcl对应settings的配置。

create table 58pbdndb(
   id INT NOT NULL AUTO_INCREMENT,
   title VARCHAR(100) NOT NULL,
   price VARCHAR(40) NOT NULL,
   quality VARCHAR(40),
   area VARCHAR(40),
   time VARCHAR(40) NOT NULL,
   PRIMARY KEY ( id )
)DEFAULT CHARSET=utf8;
AI 代码解读

注意:我并没有在表的一开始检查字段是否存在,如果你在调试过程中不止一次的话,你可能需要多次删除表中数据。
58Urlspider.py文件
58url
这个爬虫实现了2个功能。1是如果next(也就是下一页)存在,则把下一页的地址压进redis的myspider:58_urls的这个list中,供自己继续爬取。2是提取出想要爬取的商品具体网址,压进redis的myspider:start_urls的list中,供另一个爬虫爬取。
58spider-redis.py文件
58spider-redis
这个爬虫是用来抓取具体的商品信息。可以看到ItemLoader类的add_path和add_value方法的使用。

最后

运行方法跟scrapy相同,就是进入pbdnof58文件夹下(注意下面是只有spiders文件夹的那个).输入

scrapy crawl myspider_58page和scrapy crawl myspider_58
AI 代码解读

可以输入多个来观察多进程的效果。。打开了爬虫之后你会发现爬虫处于等待爬取的状态,是因为2个list此时都为空。所以需要

lpush myspider:58_urls http://hz.58.com/pbdn/0/
AI 代码解读

来设置一个初始地址,好啦,这样就可以愉快的看到所有的爬虫都动起来啦。
最后来张数据库的图
数据库

本文相对比较简单,只是scrapy-redis的基本应用。本人也比较小白,刚刚开始学习,如有什么问题,欢迎提出来共同进步。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
138
分享
相关文章
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
分布式爬虫框架Scrapy-Redis实战指南
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
本文介绍了从单机锁到分布式锁的演变,重点探讨了使用Redis实现分布式锁的方法。分布式锁用于控制分布式系统中多个实例对共享资源的同步访问,需满足互斥性、可重入性、锁超时防死锁和锁释放正确防误删等特性。文章通过具体示例展示了如何利用Redis的`setnx`命令实现加锁,并分析了简化版分布式锁存在的问题,如锁超时和误删。为了解决这些问题,文中提出了设置锁过期时间和在解锁前验证持有锁的线程身份的优化方案。最后指出,尽管当前设计已解决部分问题,但仍存在进一步优化的空间,将在后续章节继续探讨。
508 131
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
|
2月前
|
Springboot使用Redis实现分布式锁
通过这些步骤和示例,您可以系统地了解如何在Spring Boot中使用Redis实现分布式锁,并在实际项目中应用。希望这些内容对您的学习和工作有所帮助。
217 83
Redis分布式锁如何实现 ?
Redis分布式锁主要依靠一个SETNX指令实现的 , 这条命令的含义就是“SET if Not Exists”,即不存在的时候才会设置值。 只有在key不存在的情况下,将键key的值设置为value。如果key已经存在,则SETNX命令不做任何操作。 这个命令的返回值如下。 ● 命令在设置成功时返回1。 ● 命令在设置失败时返回0。 假设此时有线程A和线程B同时访问临界区代码,假设线程A首先执行了SETNX命令,并返回结果1,继续向下执行。而此时线程B再次执行SETNX命令时,返回的结果为0,则线程B不能继续向下执行。只有当线程A执行DELETE命令将设置的锁状态删除时,线程B才会成功执行S
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
122 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
Python 高级编程与实战:构建分布式系统
本文深入探讨了 Python 中的分布式系统,介绍了 ZeroMQ、Celery 和 Dask 等工具的使用方法,并通过实战项目帮助读者掌握这些技术。ZeroMQ 是高性能异步消息库,支持多种通信模式;Celery 是分布式任务队列,支持异步任务执行;Dask 是并行计算库,适用于大规模数据处理。文章结合具体代码示例,帮助读者理解如何使用这些工具构建分布式系统。
|
2月前
|
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
73 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
|
28天前
|
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
95 29
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
115 16
Redis应用—8.相关的缓存框架
Redis 与 AI:从缓存到智能搜索的融合之路
Redis 已从传统缓存系统发展为强大的 AI 支持平台,其向量数据库功能和 RedisAI 模块为核心,支持高维向量存储、相似性搜索及模型服务。文章探讨了 Redis 在实时数据缓存、语义搜索与会话持久化中的应用场景,并通过代码案例展示了与 Spring Boot 的集成方式。总结来看,Redis 结合 AI 技术,为现代应用提供高效、灵活的解决方案。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等