scrapy 被 redis 阻塞
scrapy blocked with redis
我用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时,所有的scrapy都暂停了,包括之前yield的请求。我想它应该继续 运行 旧的请求,这是什么原因以及如何解决它?请帮助我
使用Scrapy-Redis instead of reinventing the wheel. See Feeding a Spider from Redis.
我对Scrapy-Redis不熟悉,我只是知道它通过lpush urls使用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)
事实证明可行
我用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时,所有的scrapy都暂停了,包括之前yield的请求。我想它应该继续 运行 旧的请求,这是什么原因以及如何解决它?请帮助我
使用Scrapy-Redis instead of reinventing the wheel. See Feeding a Spider from Redis.
我对Scrapy-Redis不熟悉,我只是知道它通过lpush urls使用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)
事实证明可行