首页 > 解决方案 > 在scrapy中调用几个回调函数

问题描述

我正在使用scrapy,但有几个问题:

第一个问题:我把 start_requests 放在一个循环中,但函数不是从每次迭代开始的

第二个问题:我需要调用与循环给出的 start_urls 相关的不同回调,但我无法为回调提供动态名称。我想把 callback=parse_i 和我来自上面的循环。

liste [[liste1],[liste2],[liste3]]

for i in range (0, 2):
    start_urls = liste[i]

    def start_requests(self):
        #print(self.start_urls)
        for u in self.start_urls:
            try:
                req = requests.get(u)
            except requests.exceptions.ConnectionError:
                print("Connection refused")
            if req.status_code != 200:

                print("Request failed, status code is :", req.status_code)
                continue
            yield scrapy.Request(u, callback=self.parse, meta={'dont_merge_cookies': True}, dont_filter=False)

谢谢

标签: pythonscrapy

解决方案


我需要调用与start_urls循环给定的相关的不同回调,但我无法为回调提供动态名称。我想把callback=parse_ii来自上面的循环。

回调属性只需要是一个可调用的,所以你可以getattr像往常一样使用:

my_callback = getattr(self, 'parse_{}'.format(i))
yield Request(u, callback=my_callback)

另外,虽然您没有问这个问题,但从内部进行 URL 调用是非常不寻常的,start_requests因为 (a) 这就是为什么人们会使用 Scrapy 开始处理所有非 200 的东西,并且 (b) 这样做withrequests不会尊重任何一个节流、代理、用户代理、恢复或其他希望影响抓取工作的旋钮。


推荐阅读