【Python】分布式爬虫

131 阅读3分钟

python操作redis:

redis的安装与连接:

连接服务:redis-server

打开图形化界面:redis-cli

字符串的相关操作:

import redis


class TestString(object):
    # 初始化 连接redis数据库
    def __init__(self):
        self.r = redis.StrictRedis(host='127.0.0.1', port=6379)

    # 设置值
    def test_set(self):
        res = self.r.set('user', 'maria')
        print(res)

    # 取值
    def test_get(self):
        res = self.r.get('user')
        print(res, type(res))
        res = res.decode('UTF-8')
        print(res, type(res))

    # 设置多个值
    def test_mset(self):
        d = {
            'user2': 'yueyue-2',
            'user3': 'yueyue-3'
        }
        res = self.r.mset(d)
        print(res)

    # 取多个值
    def test_mget(self):
        l = ['user2', 'user3']
        res = self.r.mget(l)
        print(res)

    # 删除
    def test_del(self):
        self.r.delete('user2')


# 程序主入口
if __name__ == '__main__':
    t = TestString()  # 创建一个对象
    t.test_set()
    t.test_get()

启动 redis 服务,打开图形化界面,然后直接运行代码,

image.png

介绍: 1 Scrapy分布式爬虫意味着几台机器通过某种方式共同执行一套爬取任务, 这就首先要求每台机器都要有Scrapy框架,一套Scrapy框架就有一套Scrapy五大核心组件, 引擎--调度器--下载器--爬虫--项目管道,各自独有的调度器没有办法实现任务的共享, 所以不能实现分布式爬取。 2 假设可以实现Scrapy框架的调度器共享,那么就能实现分布式爬取了吗? 答案是不能,因为我们实现了任务的共享,但是框架之间的项目管道是单独的, 我们的任务下载完之后,我们爬取的有效信息还是不能全部存放在某个指定的位置, 所以要想实现分布式爬虫,需要同时满足调度器和项目管道的共享才可以达到分布式的效果。

分布式爬虫案例:

参考 盗墓笔记

分布式爬虫配置:

1、安装Scrapy Redis扩展

pip install scrapy-redis

2、导入依赖包

from scrapy_redis.spiders import RedisSpider

3、修改爬虫文件中 class 继承的类:

修改继承的类:
scrapy.Spider,改为 RedisSpider

定义Redis key 的名称:
redis_key = 'dm:start_urls'

4、配置 setting文件:

启用 Scrapy Redis扩展:

# 指定去重方式,给请求对象去重
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 设置的调度器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列
SCHEDULER_PERSIST = False   不保留
ITEM_PIPELINES = {
     # 'daomu.pipelines.DaomuPipeline': 300,  # 不保存到本地,可以不调用
     # 当开启该管道,该管道将会把数据存到Redis数据库中
    'scrapy_redis.pipelines.RedisPipeline': 400,  # 新增
}

配置Redis连接:
REDIS_URL = 'redis://localhost:6379'

5、终端运行:

redis-cli

keys *

flushall

lpush dm:start_urls <https://www.daomubiji.com/>

keys *

flushall

然后,新开几个窗口,

cd 项目绝对路径

然后,scrapy crawl dm

6、运行结束后,输入 keys *

image.png

  • dm:requests 存储待爬取的请求对象

    这些请求可能包括爬取的URL、请求头、请求体等信息;

    scrapy 使用这些请求对象来发送http请求并获取响应数据

  • dm:item 存储已经爬取到的数据

    这些数据可能包括http页面中提取到的文本、链接、图片等信息

    Scrapy 使用这些数据来进行进一步的分析和处理

  • dm:dupefilter 存储已经爬取过的请求的指纹

    scrapy 使用指纹来避免重复爬取同一个URL

    如果一个请求的指纹已经存在于dupefilter中,那么scrapy将不会再次爬取该请求。