Скрап заблокирован с помощью Redis - PullRequest
0 голосов
/ 23 января 2019

Я использую паук-скрап для того, чтобы выступать в роли потребителя, есть также производитель, который производит 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-адресов, вся очистка приостановилась, включая запросы, выданные ранее.Я предполагал, что следовало бы продолжать выполнять старые запросы, в чем причина и как совать это?помогите мне пожалуйста

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я не знаком с Scrapy-Redis, я просто знаю, что он использует redis по lpush urls, но я должен использовать publish / subscription в 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)

и это оказалось возможным.

0 голосов
/ 23 января 2019

Используйте Scrapy-Redis вместо изобретения колеса. См. Кормление паука от Redis .

...