繁体   English   中英

如何在scrapy蜘蛛中传递用户定义的参数

[英]How to pass a user defined argument in scrapy spider

我正在尝试将用户定义的参数传递给 scrapy 的蜘蛛。 任何人都可以建议如何做到这一点?

我在某处读到了一个参数-a但不知道如何使用它。

Spider 参数使用-a选项在crawl命令中传递。 例如:

scrapy crawl myspider -a category=electronics -a domain=system

蜘蛛可以访问参数作为属性:

class MySpider(scrapy.Spider):
    name = 'myspider'

    def __init__(self, category='', **kwargs):
        self.start_urls = [f'http://www.example.com/{category}']  # py36
        super().__init__(**kwargs)  # python3

    def parse(self, response)
        self.log(self.domain)  # system

取自 Scrapy 文档: http ://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

2013 年更新:添加第二个参数

2015 年更新:调整措辞

2016 年更新:使用更新的基类并添加超级,感谢 @Birla

2017 年更新:使用 Python3 super

# previously
super(MySpider, self).__init__(**kwargs)  # python2

2018 年更新正如@eLRuLL 指出的,蜘蛛可以将参数作为属性访问

以前的答案是正确的,但您不必每次要编写scrapy 的蜘蛛代码时都声明构造函数( __init__ ),您可以像以前一样指定参数:

scrapy crawl myspider -a parameter1=value1 -a parameter2=value2

在您的蜘蛛代码中,您可以将它们用作蜘蛛参数:

class MySpider(Spider):
    name = 'myspider'
    ...
    def parse(self, response):
        ...
        if self.parameter1 == value1:
            # this is True

        # or also
        if getattr(self, parameter2) == value2:
            # this is also True

它只是有效。

使用 crawl 命令传递参数

scrapy crawl myspider -a category='mycategory' -a domain='example.com'

要传递参数以在 scrapyd 上运行,请将-a替换为-d

curl http://your.ip.address.here:port/schedule.json -d spider=myspider -d category='mycategory' -d domain='example.com'

蜘蛛将在其构造函数中接收参数。


class MySpider(Spider):
    name="myspider"
    def __init__(self,category='',domain='', *args,**kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.category = category
        self.domain = domain

Scrapy 将所有参数都作为蜘蛛属性,你可以完全跳过init方法。 当心使用getattr方法获取这些属性,这样您的代码就不会中断。


class MySpider(Spider):
    name="myspider"
    start_urls = ('https://httpbin.org/ip',)

    def parse(self,response):
        print getattr(self,'category','')
        print getattr(self,'domain','')

Spider 参数在使用 -a 选项运行 crawl 命令时传递。 例如,如果我想将域名作为参数传递给我的蜘蛛,那么我会这样做-

scrapy crawl myspider -a domain="http://www.example.com"

并在蜘蛛的构造函数中接收参数:

class MySpider(BaseSpider):
    name = 'myspider'
    def __init__(self, domain='', *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [domain]
        #

...

它会起作用:)

或者,我们可以使用ScrapyD ,它公开一个 API,我们可以在其中传递 start_url 和蜘蛛名称。 ScrapyD 有 api 来停止/启动/状态/列出蜘蛛。

pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default

scrapyd-deploy会将蜘蛛以蛋的形式部署到守护进程中,甚至它维护蜘蛛的版本。 在启动蜘蛛时,您可以提及要使用的蜘蛛版本。

class MySpider(CrawlSpider):

    def __init__(self, start_urls, *args, **kwargs):
        self.start_urls = start_urls.split('|')
        super().__init__(*args, **kwargs)
    name = testspider

curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"

额外的优势是您可以构建自己的 UI 来接受来自用户的 url 和其他参数,并使用上面的 scrapyd schedule API 安排任务

有关更多详细信息,请参阅scrapyd API 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM