如何做一个循环回传,以免重复scrapy.request?

时间:2019-05-09 14:11:34

标签: python scrapy

我正在抓一页。我试图在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 :(得分:0)

是的,您可以让列表理解器进行循环,以使程序中仅存在文本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)

顺便说一句,我对Spider等一无所知

现在您调用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()发生时,您每次通话之前和之后的操作。