如何通过在scrapy蜘蛛用户定义的参数(How to pass a user defined ar

2019-07-23 05:14发布

我想传递一个用户定义的参数传递给scrapy的蜘蛛。 任何人都可以就如何做到这一点建议?

我读到参数-a的地方,但不知道如何使用它。

Answer 1:

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

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超

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

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



Answer 2:

以前的答案是正确的,但你不必声明构造器( __init__ )你想编写一个scrapy的蜘蛛每一次,你可以只指定参数之前:

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

它只是工作。



Answer 3:

要通过与爬行命令参数

scrapy抓取myspider -a类别= 'mycategory' -a域= 'example.com'

要将参数传递就scrapyd运行带有-d替换-a

卷曲http://your.ip.address.here:port/schedule.json -d蜘蛛= myspider -d类别= 'mycategory' -d域= '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','')



Answer 4:

使用-a选项运行抓取命令而蜘蛛参数被传递。 例如,如果我想要一个域名作为参数传递给我的蜘蛛,然后我会做这个 -

scrapy抓取myspider -a域= “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]
        #

...

它的工作:)



文章来源: How to pass a user defined argument in scrapy spider