2017-01-30 3 views
4

Когда я прошу сервер иногда отвечает на веб-страницу, которая не один, который, как ожидается, даже если статус ответ 200.I знаю, что могу использовать this method просить тот же URL-адрес несколько раз:Как разрешить один и тот же запрос в n раз больше?

def parse(response): 
    try: 
     # parsing logic here 
    except AttributeError: 
     yield Request(response.url, callback=self.parse, dont_filter=True) 

Но как можно было бы ограничить количество раз, скажем, 10 раз, что один и тот же URL-адрес может быть запрошен, чтобы избежать бесконечных циклов, когда веб-страница действительно является тем, чем она является?

ответ

1

Ну, вы можете использовать functools.partial, чтобы добавить параметр для вызова parse с параметром количества уже выполненных попыток. В случае, если это выше определенного порога (здесь 10), вы не yield новый Request. Итак:

from functools import partial 

def parse(response,ntimes=0): 
    try: 
     # parsing logic here 
     pass 
    except AttributeError: 
     if ntimes < 10: 
      yield Request(response.url, callback=partial(self.parse,ntimes=ntimes+1), dont_filter=True)

Так вот, вместо того, чтобы использовать parse в качестве обратного вызова вы обернуть partial(..) вокруг него установки ntimes к предыдущему ntimes+1 (так что вы приращению «Виртуальный» встречным, так сказать). Когда ntimes равно 10 или выше, вы больше не добавляете запрос в очередь.

Вы устанавливаете ntimes=0 по умолчанию быть 0 таким образом, что вы все еще можете добавить ссылку на parse без указания количества раз она была вызвана (в этом случае parse «предполагает» URL-адрес еще не был назван).

+1

спасибо, используя ту же логику, можно использовать 'meta' тоже, я думаю. – ChiseledAbs

+0

@ChiseledAbs: действительно. Но для этого требуется, чтобы вы сначала проверяли, привязана ли такая мета к ответу, в то время как этот ответ обеспечивает прозрачный способ. Но, действительно, до тех пор, пока вы можете каким-то образом связать информацию о количестве вызовов, сделанных с вашим ответом, это сработает. –

 Смежные вопросы

  • Нет связанных вопросов^_^