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

L L*_*iet 91 python web-crawler scrapy

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

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

Ste*_*oth 165

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

scrapy crawl myspider -a category=electronics -a domain=system
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

2015年更新:调整措辞

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

2017年更新:使用Python3 super

# previously
super(MySpider, self).__init__(**kwargs)  # python2
Run Code Online (Sandbox Code Playgroud)

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

  • scrapy crawl myspider -a category = electronics -a domain = system (3认同)
  • @FlyingAtom如果我误解了请纠正我,但这些并发呼叫中的每一个都是蜘蛛的不同实例,不是吗? (2认同)

eLR*_*uLL 24

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

scrapy crawl myspider -a parameter1=value1 -a parameter2=value2
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

它只是有效.

  • 真正。输入python的阴暗面。 (2认同)

Has*_*aza 10

使用crawl命令传递参数

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

传递参数以在scrapyd上运行替换-a-d

卷曲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
Run Code Online (Sandbox Code Playgroud)

Scrapy将所有参数作为spider属性放置,您可以完全跳过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','')

Run Code Online (Sandbox Code Playgroud)


Siy*_*lav 7

使用-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]
        #
Run Code Online (Sandbox Code Playgroud)

...

它会工作:)