2016-12-29 2 views

ответ

0

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

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

передать его в очередь, как JSon кодируются DIC:

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 
Смежные вопросы