如何在 Scrapy Spider 中传递用户定义的参数

我试图传递一个用户定义的参数到一个 Scrapy 的蜘蛛。有人能提出一些建议吗?

我在某个地方读到过一个参数 -a,但是不知道如何使用它。

74197 次浏览

Spider arguments are passed in the crawl command using the -a option. For example:

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 : 使用更新的基类并添加 super,谢谢@Birla

Update 2017: Use Python3 super

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

Update 2018: 正如@eLRuLL 所指出的, spiders can access arguments as attributes

使用抓取命令传递参数

Scrapy 匍匐 mySpider-a category = ‘ myCategory’-a domain = ‘ example.com’

要传递要在 scrapyd 上运行的参数,请将 A替换为 D

curl http://your.ip.address.here:port/schedule.json -d Spider = mySpider-d type = ‘ 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方法。注意使用 快点方法获取这些属性,这样代码就不会中断。


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 选项运行抓取命令时传递的。例如,如果我想传递一个域名作为参数给我的爬行器,然后我会这样做-

我的蜘蛛——域 = “ http://www.example.com”

And receive arguments in spider's constructors:

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

...

会成功的:)

以前的答案是正确的,但是你不必在每次编写 Scrapy’s Spider 的代码时都声明构造函数(__init__) ,你只需像以前一样指定参数:

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

在你的 Spider 代码中,你可以把它们用作 Spider 参数:

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

而且很有效。

Alternatively we can use ScrapyD which expose an API where we can pass the start_url and spider name. ScrapyD has api's to stop/start/status/list the spiders.

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

scrapyd-deploy将以 egg 的形式将爬行器部署到守护进程中,甚至它也维护爬行器的版本。在启动爬行器时,您可以提到要使用哪个版本的爬行器。

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 调度 API 来调度任务

Refer Scrapyd API 文档 for more details