第三十天:Scrapy 框架-分布式

embedded/2025/3/10 20:34:00/

文章目录

scrapy-redis%E6%A1%86%E6%9E%B6-toc" name="tableOfContents" style="margin-left:0px">一、介绍scrapy-redis框架

二、分布式原理

三、分布式爬虫的实现

scrapy-redis%E6%A1%86%E6%9E%B6%E7%9A%84%E5%AE%89%E8%A3%85-toc" name="tableOfContents" style="margin-left:0px">四、scrapy-redis框架的安装

scrapy-redis-toc" name="tableOfContents" style="margin-left:0px">五、部署scrapy-redis

六、给爬虫增加配置信息

七、运行程序

八、数据导入到mongodb中

九、数据导入到MySQL中

十、setting文件配置

scrapy-redis%E6%A1%86%E6%9E%B6" name="%E4%B8%80%E3%80%81%E4%BB%8B%E7%BB%8Dscrapy-redis%E6%A1%86%E6%9E%B6">一、介绍scrapy-redis框架

scrapy-redis

一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能。

github地址: https://github.com/darkrho/scrapy-redis

二、分布式原理

       scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的核心服务器称为master,而把用于跑爬虫程序的机器称为slave

我们知道,采用scrapy框架抓取网页,我们需要首先给定它一些start_urls,爬虫首先访问start_urls里面的url,再根据我们的具体逻辑,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,我们只需要在这个starts_urls里面做文章就行了

我们在master上搭建一个redis数据库`(注意这个数据库只用作url的存储),并对每一个需要爬取的网站类型,都开辟一个单独的列表字段。通过设置slave上scrapy-redis获取url的地址为master地址。这样的结果就是,尽管有多个slave,然而大家获取url的地方只有一个,那就是服务器master上的redis数据库

并且,由于scrapy-redis自身的队列机制,slave获取的链接不会相互冲突。这样各个slave在完成抓取任务之后,再把获取的结果汇总到服务器上

好处

程序移植性强,只要处理好路径问题,把slave上的程序移植到另一台机器上运行,基本上就是复制粘贴的事情

三、分布式爬虫的实现

  1. 使用三台机器,一台是win10,两台是centos6,分别在两台机器上部署scrapy来进行分布式抓取一个网站
  2. win10的ip地址为192.168.31.245,用来作为redis的master端,centos的机器作为slave
  3. master的爬虫运行时会把提取到的url封装成request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”
  4. slave从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis
  5. 重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中
  6. master里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的

scrapy-redis%E6%A1%86%E6%9E%B6%E7%9A%84%E5%AE%89%E8%A3%85" name="%E5%9B%9B%E3%80%81scrapy-redis%E6%A1%86%E6%9E%B6%E7%9A%84%E5%AE%89%E8%A3%85">四、scrapy-redis框架的安装

pip install scrapy-redis

scrapy-redis" name="%E4%BA%94%E3%80%81%E9%83%A8%E7%BD%B2scrapy-redis">五、部署scrapy-redis

1. slave端
    在windows上的settings.py文件的最后增加如下一行

REDIS_HOST = 'localhost' #master IP
​
REDIS_PORT = 6379

配置好了远程的redis地址后启动两个爬虫(启动爬虫没有顺序限制)

六、给爬虫增加配置信息

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
#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,
}

七、运行程序

运行slave

lpush (redis_key)  url #括号不用写

说明

  • 这个命令是在redis-cli中运行
  • redis_key 是 spider.py文件中的redis_key的值
  • url 开始爬取地址,不加双引号

八、数据导入到mongodb中

等到爬虫结束后,如果要把数据存储到mongodb中,就应该修改master端process_items.py文件,如下

import redis
​
import pymongo
​
def main():
​r = redis.Redis(host='192.168.31.245',port=6379,db=0)
​client = pymongo.MongoClient(host='localhost', port=27017)
​db = client.dmoz
​sheet = db.sheet
​while True:
​
​source, data = r.blpop(["dmoz:items"])
​item = json.loads(data)
​sheet.insert(item)
​
if __name__ == '__main__':
​main()

九、数据导入到MySQL中

等到爬虫结束后,如果要把数据存储到MySQL中,就应该修改master端process_items.py文件,如下

import redis
import pymysql
import json
def process_item():r_client = redis.Redis(host="127.0.0.1",port=6379,db =0)m_client = pymysql.connect(host="127.0.0.1",port=3306,user="root",passowrd="123456",db="lianjia")source,data =r_client.blpop("lianjia:item")item = json.loads(data)
​cursor = m_client.cursor()values = []cursor.execute(sql,values)

十、setting文件配置

#启用Redis调度存储请求队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"#确保所有的爬虫通过Redis去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#默认请求序列化使用的是pickle 但是我们可以更改为其他类似的。PS:这玩意儿2.X的可以用。3.X的不能用
#SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"#不清除Redis队列、这样可以暂停/恢复 爬取
#SCHEDULER_PERSIST = True#使用优先级调度请求队列 (默认使用)
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
#可选用的其它队列
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'#最大空闲时间防止分布式爬虫因为等待而关闭
#这只有当上面设置的队列类是SpiderQueue或SpiderStack时才有效
#并且当您的蜘蛛首次启动时,也可能会阻止同一时间启动(由于队列为空)
#SCHEDULER_IDLE_BEFORE_CLOSE = 10#将清除的项目在redis进行处理
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300
}#序列化项目管道作为redis Key存储
#REDIS_ITEMS_KEY = '%(spider)s:items'#默认使用ScrapyJSONEncoder进行项目序列化
#You can use any importable path to a callable object.
#REDIS_ITEMS_SERIALIZER = 'json.dumps'#指定连接到redis时使用的端口和地址(可选)
#REDIS_HOST = 'localhost'
#REDIS_PORT = 6379#指定用于连接redis的URL(可选)
#如果设置此项,则此项优先级高于设置的REDIS_HOST 和 REDIS_PORT
#REDIS_URL = 'redis://user:pass@hostname:9001'#自定义的redis参数(连接超时之类的)
#REDIS_PARAMS  = {}#自定义redis客户端类
#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'#如果为True,则使用redis的'spop'进行操作。
#如果需要避免起始网址列表出现重复,这个选项非常有用。开启此选项urls必须通过sadd添加,否则会出现类型错误。
#REDIS_START_URLS_AS_SET = False#RedisSpider和RedisCrawlSpider默认 start_usls 键
#REDIS_START_URLS_KEY = '%(name)s:start_urls'#设置redis使用utf-8之外的编码
#REDIS_ENCODING = 'latin1'


http://www.ppmy.cn/embedded/171572.html

相关文章

学网络安全可以考取哪些证书?

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 在IT领域,证书是一个重要的加分项,更是我们升职加薪的好帮手,那么网络安全相关证书有哪些?网络安全相关的证书种类繁多&#…

点云软件VeloView开发环境搭建与编译

官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…

【docker简化部署有状态prometheus+grafana】

文章目录 第一步 下载依赖第二步 选择一个有权限的文件夹新建配置文件prometheus.ymldocker中运行命令存储数据启动prometheus 第三步 启动grafana 第一步 下载依赖 docker pull grafana/grafana:latest docker pull prom/prometheus:latest第二步 选择一个有权限的文件夹 例…

推测gpt4o视觉皮层建立的过程

一、视觉输入的编码与结构化 视觉Tokenization的底层逻辑 图像分块与降维:输入图像被分割为固定大小的区块(例如16x16像素),每个区块通过线性变换(矩阵乘法)压缩为低维向量(如768维)…

视频理解开山之作 “双流网络”

1 论文核心信息 1.1核心问题 任务:如何利用深度学习方法进行视频中的动作识别(Action Recognition)。挑战: 视频包含时空信息,既需要捕捉静态外观特征(Spatial Information),也需要…

神经网络为什么要用 ReLU 增加非线性?

在神经网络中使用 ReLU(Rectified Linear Unit) 作为激活函数的主要目的是引入非线性,这是神经网络能够学习复杂模式和解决非线性问题的关键。 1. 为什么需要非线性? 1.1 线性模型的局限性 如果神经网络只使用线性激活函数&…

Linux网络编程——TCP并行服务器

在 Linux 网络编程中,通过不同的技术来实现一个 TCP 并行服务器,能够有效地处理多个客户端连接。我们可以使用 多线程、多进程进程池 和 I/O 多路复用(如 select、poll 或 epoll)来提高服务器的性能。以下是分步实现的代码示例&am…

TP-LINK图像处理工程师(深圳)内推

1. 计算机、模式识别、信号处理、应用数学类专业。 2.熟悉色域空间转换,亮度、噪声,对比度等基础图像处理知识。 3.有图像处理相关项目开发经验者优先(如降噪、AE、AWB等);熟悉3DNR、编码相关知识者优先。 【专属内推码…