Відповіді:
Аргументи павука передаються в 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
Взято з документа Scrap: 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 , павуки можуть отримати аргументи як атрибути
self.domain
, я все ще не можу отримати доступ до нього поза __init__
методом. Python видає не визначену помилку. До речі, чому ви пропустили super
дзвінок? PS. Я працюю з класом CrawlSpider
__init__
- метод класу павуків. Її реалізація сама по собі не робить павука менш надійним, і він міститься у відповіді, щоб показати, що ви можете оголосити за замовчуванням для аргументів ключових слів, але, як ви сказали, це необов'язково. Як ми зазначали минулого року, вам не потрібно використовувати, getattr
ви можете просто отримати аргументи як атрибути, наприклад, self.category
або як ми бачимо у відповідіself.domain
Попередні відповіді були правильними, але вам не потрібно декларувати конструктор ( __init__
) щоразу, коли ви хочете кодувати павук скрапінгу, ви можете просто вказати параметри, як раніше:
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
І це просто працює.
Для передачі аргументів командою обходу
scrap сканування myspider -a category = 'mycategory' -a domain = 'example.com'
Для передачі аргументів для запуску scrapd замініть -a на -d
завиток http://your.ip.address.here:port/schedule.json -d spider = myspider -d категорія = '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
Scrap висуває всі аргументи як атрибути павука, і ви можете пропустити метод 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','')
Аргументи павука передаються під час виконання команди обходу за допомогою параметра -a. Наприклад, якщо я хочу передати доменне ім'я як аргумент своєму павуку, я зроблю це,
scrap сканування 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]
#
...
це буде працювати :)
Крім того, ми можемо використовувати ScrapyD, який виставляє API, де ми можемо передати ім'я start_url та павук. ScrapD має api для зупинки / запуску / статусу / списку павуків.
pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default
scrapyd-deploy
розгорне павука у вигляді яйця в демон і навіть він підтримує версію павука. Під час запуску павука ви можете згадати, яку версію павука використовувати.
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"
Додатковою перевагою є те, що ви можете створити власний інтерфейс користувача, щоб приймати URL-адресу та інші параметри від користувача та планувати завдання, використовуючи вищевказаний API розкладу
Детальнішу інформацію див. У документації API scrapyd