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

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

3年前 评论
haohongbin (楼主) 3年前
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年前 评论

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