Вы спрашиваете, почему второй код не работает, но я не думаю, что вы полностью понимаете, почему работает первый код:)
for
цикл вашего первого кода повторяется только один раз .
То, что происходит:
self.parse()
вызывается для URL в self.start_urls
.
self.parse()
получает первый (и только первый!) URL из self.urls
и возвращает его, выходя из self.parse()
.
Когда приходит ответ на этот первый URL, self.parse()
вызывается снова, и на этот раз он возвращает запрос (только 1 запрос!) Для второго URL из self.urls
, поскольку предыдущий вызов self.parse()
уже использовал первый URL-адрес (self.urls
- итератор ).
Последний шаг повторяется в цикле, но это не цикл for
, который делает это.
Вы можете изменить исходный код на этот, и он будет работать так же:
def parse(self, response):
try:
return next(self.urls)
except StopIteration:
pass