如何最多允许n次相同的请求?

时间:2017-01-30 18:54:38

标签: python scrapy

当我请求服务器时,它有时会回复一个网页,即使响应状态为200,也不会是预期的网页。我知道我可以使用this method多次请求相同的网址:

def parse(response):
    try:
        # parsing logic here
    except AttributeError:
        yield Request(response.url, callback=self.parse, dont_filter=True)

但是如何限制次数,让我们说10次,可以请求相同的网址,以避免在网页确实是什么时出现无限循环?

1 个答案:

答案 0 :(得分:1)

您可以使用functools.partial添加参数以使用已完成尝试次数的参数调用parse。如果这高于某个阈值(此处为10),则不会yield新的Request。所以:

from functools import partial

def parse(response,ntimes=0):
    try:
        # parsing logic here
        pass
    except AttributeError:
        if ntimes < 10:
            yield Request(response.url, callback=partial(self.parse,ntimes=ntimes+1), dont_filter=True)

所以这里不是使用parse作为回调而是围绕它设置partial(..),将ntimes设置为前一个ntimes+1(所以你增量&#34;虚拟&#34;计数器可以这么说)。当ntimes为10或更高时,您不再将请求添加到队列中。

您默认将ntimes=0设置为0,这样您仍然可以添加对parse的引用,而无需指定其被调用的次数(在这种情况下{{1} &#34;假设&#34;网址尚未被调用。)