簡體   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