scrapy 分布式爬虫- RedisSpider

本文介绍了一种使用Scrapy和Redis实现的分布式爬虫方案,通过多台机器并发爬取当当网书籍信息,利用Redis共享待爬取的请求,有效提升爬虫效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

爬去当当书籍信息

多台机器同时爬取,共用一个redis记录 scrapy_redis

带爬取的request对象储存在redis中,每台机器读取request对象并删除记录,经行爬取。实现分布式爬虫

import scrapy
from scrapy_redis.spiders import RedisSpider
from copy import deepcopy


class DangdangSpider(RedisSpider):
    name = 'dangdang'
    allowed_domains = ['dangdang.com']
    # 开始爬虫,会从redis的key中读取start_url.
    redis_key = "dangdang" # lpush dangdang 'http://book.dangdang.com/'

    def parse(self, response):
        # 大分类
        div_list = response.xpath("//div[@class='con flq_body']/div")[:-4]
        print(len(div_list), 'duoshao')
        for div in div_list:
            item = {}
            item['b_cate'] = div.xpath("./dl/dt//text()").extract()
            item['b_cate'] = [i.strip() for i in item['b_cate'] if len(i.strip())>0] # 过滤掉空字符
            print('b_cate:', item['b_cate'])
            # 中间分类
            if item['b_cate'] == ['创意文具']:
                print(item['b_cate'], "pass......")
                item['m_cate'] = None
                item['s_cate_url'] = div.xpath("./dl/dt/a/@ddt-src").extract_first()
                print('s_cate_url:', item['m_cate'])
                # yield scrapy.Request(
                #     item['s_cate_url'],
                #     callback=self.parse_special,
                #     meta={'item': deepcopy(item)}
                # )
            else:
                dl_list = div.xpath(".//dl[@class='inner_dl']")
                for dl in dl_list:
                    item['m_cate'] = dl.xpath("./dt//text()").extract()
                    item['m_cate'] = [i.strip() for i in item['m_cate'] if len(i.strip())>0]
                    # 小分类
                    dd_list = dl.xpath("./dd")
                    for dd in dd_list:
                        item['s_cate'] = dd.xpath("./a/@title").extract_first()
                        item['s_cate_url'] = dd.xpath("./a/@ddt-src").extract_first()
                        # 小分类的所有书籍
                        if item['s_cate_url'] is not None:
                            yield scrapy.Request(
                                item['s_cate_url'],
                                callback=self.parse_books,
                                meta={'item': deepcopy(item)}
                            )

    def parse_special(self, response):
        ''' 文具信息 '''
        pass

    def parse_books(self, response):
        item = response.meta['item']
        # 当前小分类的书籍
        li_list = response.xpath("//ul[@class='list_aa ']/li")
        if li_list is not None:
            for li in li_list:
                try:
                    item['book_price'] = li.xpath(".//span[@class='num']/text()").extract_first() + \
                                         li.xpath(".//span[@class='tail']/text()").extract_first()
                except:
                    item['book_price'] = 'Unknown'
                item['book_url'] = li.xpath("./a/@href").extract_first()
                if item['book_url'] is not None:
                    yield scrapy.Request(
                        item['book_url'],
                        callback=self.parse_book_detail,
                        meta={'item': deepcopy(item)}
                    )

    def parse_book_detail(self, response):
        item = response.meta['item']
        item['book_name'] = response.xpath("//div[@class='name_info']/h1/img/text()").extract_first()
        item['book_desc'] = response.xpath("//span[@class='head_title_name']/text()").extract_first()
        # 这一本书籍的详细信息
        span_list = response.xpath("//div[@class='messbox_info']/span")
        item['book_author'] = span_list.xpath("./span[1]/a/text()").extract() # 可能多个作者
        item['publisher'] = span_list.xpath("./span[2]/a/text()").extract_first()
        item['pub_date'] = span_list.xpath("./span[3]/text()").extract_first()
        print(item)
        # yield item

 

posted on 2019-05-10 16:27 .Tang 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/tangpg/p/10845174.html

### Scrapy 分布式爬虫概述 Scrapy 是一种强大的网络爬取框架,能够高效地抓取网页数据并处理。为了应对大规模的数据采集需求,分布式爬虫成为了一种有效的解决方案[^1]。 ### 实现方式 对于构建基于 Scrapy分布式爬虫系统而言,通常会采用 Redis 作为中间件来协调多个工作节点之间的任务分配与状态同步。具体来说: - **Redis 队列**:所有的 URL 请求被存储到 Redis 中形成待访问队列;各个 Worker 节点通过连接至同一份 Redis 数据库获取未处理过的链接地址执行下载操作。 - **去重机制**:为了避免重复请求相同的页面,在项目初始化阶段需设置指纹过滤器(Fingerprint Filter),它同样依赖于 Redis 来保存已访问过的目标站点标识符,从而确保整个集群内不会发生冗余抓取行为[^2]. ```python from scrapy_redis.spiders import RedisSpider class MySpider(RedisSpider): name = 'myspider' redis_key = 'start_urls' def parse(self, response): # 解析逻辑... ``` ### 版本差异 随着 Scrapy 和其扩展组件 `scrapy-redis` 不断迭代更新,两者之间存在一些值得注意的变化之处: - 在较新的版本中,部分参数名称有所调整,例如从早期使用的 `REDIS_HOST` 改为现在的 `redis://localhost:6379/0` 形式的 URI 连接字符串定义数据库位置[^3]. - 新增特性支持如优先级调度、批量提交等功能优化性能表现,同时也改进了错误恢复能力使得系统更加健壮可靠[^4]. ### 教程推荐 针对初学者入门学习如何搭建一套完整的 Scrapy 分布式架构体系,建议按照如下路径逐步深入理解各知识点: - 掌握 Python 编程基础以及异步 I/O 概念; - 学习 Scrapy 原生单机版开发流程及其核心概念 (Item Pipeline, Middleware 等); - 熟悉 Redis 使用方法特别是键值对操作指令集; - 参考官方文档或其他高质量社区资源了解最新最佳实践案例分享[^5].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值