我正在抓一页。我试图在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])
]
答案 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()
发生时,您每次通话之前和之后的操作。