如何在scrapy spider中传递用户定义的参数
- 2025-03-19 08:57:00
- admin 原创
- 56
问题描述:
我正在尝试将用户定义的参数传递给 scrapy 的蜘蛛。有人能建议如何做到这一点吗?
我在某处读到一个参数,-a
但不知道如何使用它。
解决方案 1:
crawl
Spider 参数使用选项在命令中传递-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 super
# previously
super(MySpider, self).__init__(**kwargs) # python2
2018 年更新:正如 @eLRuLL 指出的那样,蜘蛛可以将参数作为属性来访问
解决方案 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
而且它确实有效。
解决方案 3:
使用 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','')
解决方案 4:
运行 crawl 命令时,使用 -a 选项传递 Spider 参数。例如,如果我想将域名作为参数传递给我的 spider,那么我会这样做:
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]
#
...
它会起作用的:)
解决方案 5:
或者,我们可以使用ScrapyD,它公开了一个 API,我们可以在其中传递 start_url 和蜘蛛名称。ScrapyD 具有用于停止/启动/状态/列出蜘蛛的 API。
pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default
scrapyd-deploy
将以 egg 的形式将 spider 部署到守护进程中,甚至它还维护 spider 的版本。在启动 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 和其他参数,并使用上面的 scrapyd 计划 API 来安排任务
有关更多详细信息,请参阅scrapyd API 文档
扫码咨询,免费领取项目管理大礼包!