刮板被redis阻塞

时间:2019-01-23 09:32:29

标签: python redis scrapy yield

我用一只抓痒的蜘蛛充当消费者,也有一个生产者生产网址并将它们不规则地放入redis中,我的代码如下:

def start_requests(self): 
    for msg in self.redis_sub.listen():
        data = json.loads(msg['data'].decode('utf-8'))
        id = data['id']
        styleUrl = data['styleUrl']
        pageCount = data['pageCount']
        self.obi.public(json.dumps({'id': id, 'isSynchronized': 1}))
        yield SplashRequest(url=styleUrl, callback=self.specHome_parse,
                                args={'wait': 5, 'timeout': 60, 'images': 0},
                                meta={'pageCount': pageCount, 'id': id, 'dont_redirect': True})

这些代码可以正常接收URL,但是当它在第二行中阻塞以等待URL时,所有的问题都暂停了,包括之前产生的请求。我以为它应该继续运行旧的requeset,是什么原因以及如何解决它?请帮助我

2 个答案:

答案 0 :(得分:1)

使用Scrapy-Redis而不是重新发明轮子。参见Feeding a Spider from Redis

答案 1 :(得分:0)

我不喜欢Scrapy-Redis,我只知道它通过lpush url使用redis,但是我必须在redis中使用发布/订阅,所以我采用了这种方法:

    def start_requests(self):
    while True:
        try:
            msg = self.redis_sub.parse_response(block=False, timeout=5)
            if msg[0] != b'message':
                continue
            data = json.loads(msg[2].decode('utf-8'))
            id = data['id']
            styleUrl = data['styleUrl']
            pageCount = data['pageCount']
            self.obi.public(json.dumps({'id': id, 'isSynchronized': 1}))
            yield SplashRequest(url=styleUrl, callback=self.specHome_parse,
                                args={'wait': 5, 'timeout': 60, 'images': 0},
                                meta={'pageCount': pageCount, 'id': id, 'dont_retry': True})
        except Exception as e:
            yield SplashRequest()
            print(e)

这被证明是可行的。