Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用redis堵住的刮痕_Python_Redis_Scrapy_Yield - Fatal编程技术网

Python 用redis堵住的刮痕

Python 用redis堵住的刮痕,python,redis,scrapy,yield,Python,Redis,Scrapy,Yield,我使用scrapy spider作为消费者,还有一个生产商生产URL并不定期地将其放入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'] pag

我使用scrapy spider作为消费者,还有一个生产商生产URL并不定期地将其放入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时,all scrapy暂停,包括之前生成的请求。我想它应该继续运行旧的请求集,原因是什么,如何解决?请帮帮我

使用而不是重新发明轮子。请参阅。

我不熟悉Scrapy Redis,我只知道它通过lpush URL使用Redis,但我必须在Redis中使用publish/subscription,因此我采用了这样的方法:

    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)
实践证明是可行的