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

时间:2013-03-25 09:35:14

标签: python scrapy web-crawler

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

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

5 个答案:

答案 0 :(得分:144)

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

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 doc: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 As @eLRuLL points out,蜘蛛可以作为属性访问参数

答案 1 :(得分:17)

以前的答案是正确的,但是每次想要编写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

它只是有效。

答案 2 :(得分:7)

使用抓取命令传递参数

  

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','')

答案 3 :(得分:6)

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

  

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

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

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

...

它会起作用:)

答案 4 :(得分:0)

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

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

scrapyd-deploy将以鸡蛋的形式将蜘蛛部署到守护程序中,甚至维护蜘蛛的版本。启动Spider时,您可以提及要使用哪个版本的Spider。

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和其他参数,并使用上面的scraped schedule API安排任务

请参阅scrapyd API documentation以获取更多详细信息