繁体   English   中英

如何制作循环以便不重复scrapy.request?

[英]How to make a loop in return so that not to repeat scrapy.request?

我正在抓页。 我试图在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])
        ]

是的,你可以让列表理解做循环,这样程序中只有一个文本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)

顺便说一句我对蜘蛛等一无所知

现在你调用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()发生时你做什么以及你在每个之前和之后做什么呼叫。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM