Python операторы yield и return? и Scrapy уступая просьбам - PullRequest
5 голосов
/ 08 января 2012

В чем разница между yield и return поясните на примере?и что на самом деле происходит, когда в генераторе мы yield получаем любое значение или запрос?

Я не вызываю мой генератор из какой-либо другой функции или программы.

Мой цикл:

for index in range(3):
  yield Request(url,callback=parse)

Это делает запросы по определенному URL и вызывает функцию обратного вызова после запроса.Что делает этот код?

И в какой последовательности следует код?

Ответы [ 2 ]

1 голос
/ 08 января 2012

Единственный аспект вашего вопроса, на который не отвечает вопрос, связанный с @Jochen, это «я не вызываю свой генератор из какой-либо другой функции или программы».

Вы определяете свой класс сканераи scrapy вызывает (специальные) функции, которые вы определяете, как указано в документации.(Например, функция parse является обратным вызовом по умолчанию для запросов, которые не указывают обратный вызов).

0 голосов
/ 15 июля 2017

Я полагаю, вы столкнулись с головоломкой в ​​функции start_requests() с контекстом yield в ней.

Например:

def start_requests(self):
    urls = [
        'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
    ]
    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse)

Когда вы обращаетесь к документу scrapy spider и затем находите функцию с именем start_requests(), он говорит, что метод должен вернуть итерацию. Если вы измените yield на return, он не будет повторяться, поскольку цикл for уже закончился, когда вы запускаете spider.Это может быть беспорядок.

Вполне естественно, что ваш паук должен посылать http-запросы в эти пункты назначения один за другим, поэтому лучший способ - это генератор. В цикле for ваш паук остановится на yield и вернется scrapy.Request(), когда все будет сделано, ваш паук send() отправит генератор и перейдет к следующему следующие URL-адреса в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...