scrapy 递归爬取如何传递参数,循环 yield 时总是得到最后一个数据?

for course in courseData:
    song_id = copy.deepcopy(course["courseId"])
    item['songId'] = song_id
    item['courseName'] = course["courseName"]
    song_data = self.song_data(song_id)
    request = scrapy.Request(method="POST",meta={"item":item},url=self.song_url,body=song_data,callback=self.parse_song)
    yield request

这段代码,请求时,只能请求循环最后一次的song_data

Jason990420
最佳答案

如果 request 有copy 的方法, 可以使用 yield request.copy(), 没有就 yield copy.deepcopy(request)

3年前 评论
haohongbin (楼主) 3年前
讨论数量: 4
Jason990420

在 for 回路与 scrapy.Request 有关的是

meta={"item":item}
body=song_data

item, song_id 都来自回路的自变数 course.

唯一来源不明的是 (因为没给函数内容)

song_data = self.song_data(song_id)

看起来其他应该都OK, 那就只有猜 self.song_data 函数有鬼... 返回内容都是固定的.

这段代码,请求时,只能请求循环最后一次的 song_data

是只有一次, 还是每次都一样??

如果只有一次, 代表courseData的长度只是1

3年前 评论
haohongbin (楼主) 3年前
pardon110

给出的代码只是递归发起请求,你需要在于pipline 中处理递归路径中返回的数据,否则只会爬到最后一次。

3年前 评论

同意楼上,没看到你的处理逻辑,要yield item。

3年前 评论
Jason990420

如果 request 有copy 的方法, 可以使用 yield request.copy(), 没有就 yield copy.deepcopy(request)

3年前 评论
haohongbin (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!