Как передать пользовательский аргумент в scrapy spider
Я пытаюсь передать определяемый пользователем аргумент, чтобы паука в scrapy это. Может ли кто-нибудь предложить, как это сделать?
Я читал о параметре -a
где-то, но понятия не имею, как использовать его.
4 ответа:
аргументы 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
обновление добавить второй аргумент
обновление 2015: измените формулировку
обновление 2016: используйте новый базовый класс и добавить супер, спасибо @Birla
обновление 2017: используйте Python3 super
# previously super(MySpider, self).__init__(**kwargs) # python2
обновить 2018: как указывает @eLRuLL, пауки могут обращаться к аргументам как к атрибутам
предыдущие ответы были правильными, но вам не нужно объявлять конструктор (
__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
и это просто работает.
аргументы Spider передаются во время выполнения команды обхода с помощью параметра-a. Например, если я хочу передать доменное имя в качестве аргумента моему пауку, то я сделаю это -
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] #
...
он будет работать :)
для передачи аргументов с помощью команды обхода
scrapy crawl myspider-a category= 'mycategory' - a domain='example.com'
чтобы передать аргументы для запуска на scrapyd заменить - a С - d
curl http://your.интеллектуальная собственность.адрес.здесь:порт/расписание.json - d spider=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','')