【问题标题】:scrapy blocked with redis被redis阻塞的scrapy
【发布时间】:2019-01-23 09:32:29
【问题描述】:

我用一个scrapy蜘蛛做消费者,还有一个生产者生产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都暂停了,包括之前产生的请求。我认为它应该继续运行旧的请求,原因是什么以及如何解决它?请帮帮我

【问题讨论】:

    标签: python redis scrapy yield


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我不熟悉Scrapy-Redis,我只知道它通过lpush urls使用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)
      

      证明是可行的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 2020-09-22
        • 1970-01-01
        相关资源
        最近更新 更多