Как сделать петлю взамен, чтобы не повторять scrapy.request? - PullRequest
0 голосов
/ 09 мая 2019

Я очищаю страницу. Я пытался сделать цикл в функции return, но он не работал. Это дало мне результат только первой ссылки. Я хочу сделать цикл, чтобы я мог вернуть все три значения.

class SiteFetching(scrapy.Spider):
    name = 'Site'

    def start_requests(self):
        links = {'transcription_page': 'https://www.rev.com/freelancers/transcription',
                 'captions_page': 'https://www.rev.com/freelancers/captions',
                 'subtitles_page': 'https://www.rev.com/freelancers/subtitles'}
        call = [self.parse_transcription, self.parse_caption, self.parse_subtitles]

        return [
            scrapy.Request(links['transcription_page'], callback=call[0]),
            scrapy.Request(links['captions_page'], callback=call[1]),
            scrapy.Request(links['subtitles_page'], callback=call[2])
        ]

1 Ответ

0 голосов
/ 09 мая 2019

Да, вы можете сделать, чтобы списки выполняли цикл так, чтобы в программе был только один экземпляр текста scrapy.Request(), но, конечно, будучи циклом, функция будет вызываться один раз за цикл:

class SiteFetching(scrapy.Spider):
    name = 'Site'

    def start_requests(self):
        links = [('https://www.rev.com/freelancers/transcription', self.parse_transcription),
                 ('https://www.rev.com/freelancers/captions', self.parse_caption),
                 ('https://www.rev.com/freelancers/subtitles', self.parse_subtitles)]

        return [scrapy.Request(link[0], callback=link[1]) for link in links]

Другой вариант, если вы хотите избежать одновременного выполнения всех запросов и ожидания их возврата, это использовать выражение генератора:

        return (scrapy.Request(link[0], callback=link[1]) for link in links)

Кстати, я ничего не знаю о Spideretc

Теперь вы звоните start_requests(), но он возвращает генератор, и вы вызываете next(), чтобы сделать каждый Request():

sf = SiteFetching()   # I assume this is how you instantiate SiteFetching
gen = sf.start_requests()   # Only returns a generator
req = next(gen)   # Only here does the first call to Request() occur with callback to follow.

Я показал только один экземплярвызова next(), но у вас может быть цикл (или итерация по нему с помощью for), но в любом случае вы можете сказать, когда происходит Request() и что вы делаете до и после каждого вызова.

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