Как толкать параметр post в scrapy-redis

У меня есть запрос на сообщение, как

def start_requests(self):
    yield FormRequest(url,formdata={'id': "parameter from redis"})

Можно ли использовать redis-cli lpush для сохранения параметра post и запуска его моим искателем?

1 ответ

  1. По умолчанию очередь scrapy-redis работает только с url в качестве сообщений.
    Одно сообщение = один url. Но вы можете изменить это поведение.
    Например, можно использовать некоторые объекты для сообщений / запросов:

        class ScheduledRequest:
            def __init__(self, url, method, body)
                self.url = url
                self.method = method
                self.body = body
    

    Передайте его в очередь как кодированный dic json:

        redis.lpush(
            queue_key,
            json.dumps(
                ScheduledRequest(
                   url='http://google.com',
                   method='POST',
                   body='some body data ...'
                ).__dict__
            )
        )
    

    И переписать методы make_request_from_data и schedule_next_requests:

    class MySpiderBase(RedisCrawlSpider, scrapy.Spider):
    
        def __init__(self, *args, **kwargs):
            super(MySpiderBase, self).__init__(*args, **kwargs)
    
        def make_request_from_data(self, data):
            scheduled = ScheduledRequest(
                **json.loads(
                    bytes_to_str(data, self.redis_encoding)
                )
            )
            # here you can use and FormRequest
            return scrapy.Request(url=scheduled.url, method=scheduled.method, body=scheduled.body)
    
       def schedule_next_requests(self):
           for request in self.next_requests():
               self.crawler.engine.crawl(request, spider=self)
    
       def parse(self, response):
           pass