请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

scrapy-redis中master和slave的通信

老师,从这节课看scrapy-redis的入口是name:start_urls,那slave端要如何获取master端存入name:requests的请求呢,从master那yield的话应该也没办法回调slave上的处理函数吧,是有提供方法还是需要我自己重写相关的源码

正在回答

1回答

bobby 2020-04-07 18:04:36

https://img1.sycdn.imooc.com//szimg/5e8c500609d8150408990801.jpg 如果是slave 那么重写这个方法就行了, 记住 master不要这么写, 我把这个代码给你贴一下:

def next_requests(self):
    found = 0
    # TODO: Use redis pipeline execution.
    while found < self.redis_batch_size:
        req = self.crawler.engine.slot.scheduler.queue.pop(0)
        if not req:
            # Queue empty.
            break
        if req:
            yield req
            found += 1
        else:
            self.logger.debug("Request not made from data: %r", req.url)

    if found:
        self.logger.debug("Read %s requests from '%s'", found, self.redis_key)


0 回复 有任何疑惑可以回复我~
  • 提问者 慕函数7358036 #1
    其余部分master和slave一样就可以了是吗
    然后我有点没搞明白,如果直接使用scrapy-redis什么都不动的话那这个分布式究竟是如何体现的,是不是就是多台设备连接同一个Redis数据库,各台设备做完全一样的事情都从这个库里存/拿任务,不在乎这个任务究竟来自哪?那如果是这样的话入库又怎么说,多台设备建立多个连接至数据库分别入库?还是说由某一设备集中入库?
    回复 有任何疑惑可以回复我~ 2020-04-07 19:12:15
  • bobby 回复 提问者 慕函数7358036 #2
    是的 ,多台服务器读取同一个redis不分从哪里来的,但是你这里提到了一个非常重要的问题就是数据库怎么办? 其实如果要讲解到这个问题那么整个框架可能会变得更加复杂,实际上scrapy-redis还提供了一个功能就是将item放入到redis中,这样你可以自己写存储服务 去入库,想怎么处理就自己写就行了,但是这样就把pipeline的功能单独拎出来了会增加系统的复杂性 所以课程没有讲解这个,你如果感兴趣可以了解一下scrapy-redis的这个功能配置
    回复 有任何疑惑可以回复我~ 2020-04-08 12:23:08
  • 提问者 慕函数7358036 #3
    老师我还有一个问题,关于scrapy-splash的
    我确定splash服务已经启动成功了,从网页进行验证确实可以进行JS渲染,setting也按照官方文档配置过了,但是在爬虫中yield splashrequest得到的response还是没渲染过的,这是部分代码:
    lua_script = '''
            function main(splash, args)
            splash:go(args.url)
            splash:wait(5)
            return splash:html()
            end'''
    # yield SplashRequest(url="https://www.cnblogs.com/dongxishaonian/p/12653200.html", endpoint="execute",
                #                     callback=self.parse_detail, args={"lua_source": lua_script, 'images': 0})
    
    yield SplashRequest(url="https://www.cnblogs.com/dongxishaonian/p/12653200.html", endpoint='render.html',
                                    callback=self.parse_detail, args={'wait': 10, })
    
    两种都不行,那个lua脚本在网页中使用是没有问题的,这什么原因,爬的是博客园的博客页面,想要获取页面上的分类和标签,这两个都是异步加载的
    
    这是setting:
    DOWNLOADER_MIDDLEWARES = {
        # 'master_spider.middlewares.MasterSpiderDownloaderMiddleware': 543,
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    回复 有任何疑惑可以回复我~ 2020-04-08 21:59:26
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信