如何动态设置废规则?

2024-10-01 15:36:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类在初始化之前运行一些代码:

class NoFollowSpider(CrawlSpider):
    rules = ( Rule (SgmlLinkExtractor(allow=("", ),),
                callback="parse_items",  follow= True),
)

def __init__(self, moreparams=None, *args, **kwargs):
    super(NoFollowSpider, self).__init__(*args, **kwargs)
    self.moreparams = moreparams

我用以下命令运行这个垃圾代码:

^{pr2}$

现在,我希望可以从命令行配置名为rules的静态变量:

> scrapy runspider my_spider.py -a crawl=True -a moreparams="more parameters" -o output.txt

init更改为:

def __init__(self, crawl_pages=False, moreparams=None, *args, **kwargs):
    if (crawl_pages is True):
        self.rules = ( Rule (SgmlLinkExtractor(allow=("", ),), callback="parse_items",  follow= True),
    )
    self.moreparams = moreparams

但是,如果我在init中切换静态变量rules,scrapy就不再考虑它了:它运行,只对给定的起始url进行爬网,而不是对整个域进行爬网。规则似乎必须是静态类变量。在

那么,如何动态设置静态变量呢?在


Tags: 代码selftrueinitcallback静态argsrule
3条回答

下面是我如何在@Not_a_đu Golfer和@nramirezuy的大力帮助下解决问题的,我只是利用了他们的建议:

class NoFollowSpider(CrawlSpider):

def __init__(self, crawl_pages=False, moreparams=None, *args, **kwargs):
    super(NoFollowSpider, self).__init__(*args, **kwargs)
    # Set the class member from here
    if (crawl_pages is True):
        NoFollowSpider.rules = ( Rule (SgmlLinkExtractor(allow=("", ),), callback="parse_items",  follow= True),)
        # Then recompile the Rules
        super(NoFollowSpider, self)._compile_rules()

    # Keep going as before
    self.moreparams = moreparams

谢谢大家的帮助!在

在定义规则之前,compiled。在

你有两个选择。更简单的一个-我不确定它是否能工作,只是简单地使用类而不是构造函数中的self来设置规则:

def __init__(self, session_id=-1, crawl_pages=False, allowed_domains=None, start_urls=None, xpath=None, contains = None, doesnotcontain=None, *args, **kwargs):

    #You simply set the class member from here
    NoFollowSpider.rules = ( Rule (SgmlLinkExtractor(allow=("", ),),
                callback="parse_items",  follow= True),)

我不确定斯皮奇是否会尊重这一点——这取决于它何时阅读这些规则。但值得一试。在

另一种更复杂的方法是使用元类。基本上,您可以干预类的创建方式,而不仅仅是它的实例。注意,元类的__new__方法发生在导入时上,在任何代码运行之前。在

^{pr2}$

相关问题 更多 >

    热门问题