Як передавати визначений користувачем аргумент в павуці скрапінгу


100

Я намагаюся передати визначений користувачем аргумент павуку скрапінгу. Хтось може підказати, як це зробити?

Я -aдесь читав про параметр, але не маю уявлення, як ним користуватися.

Відповіді:


188

Аргументи павука передаються в 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 , павуки можуть отримати аргументи як атрибути


3
scrap crawl myspider -a kategorija = електроніка -домен = система
Стівен Альмерот

1
Вищеописаний код для мене працює лише частково. Наприклад, наприклад. Якщо я визначу домен за допомогою self.domain, я все ще не можу отримати доступ до нього поза __init__методом. Python видає не визначену помилку. До речі, чому ви пропустили superдзвінок? PS. Я працюю з класом CrawlSpider
Birla

2
@ FlyingAtom Будь ласка, виправте мене, якщо я неправильно зрозумів, але кожен з цих одночасних дзвінків був би різними випадками павука, чи не так?
L Lawliet

1
@Birla, використовуйте self.domain = домен у конструкторі для заповнення змінної області дії класу.
Хасан Раза

1
@nealmcb __init__- метод класу павуків. Її реалізація сама по собі не робить павука менш надійним, і він міститься у відповіді, щоб показати, що ви можете оголосити за замовчуванням для аргументів ключових слів, але, як ви сказали, це необов'язково. Як ми зазначали минулого року, вам не потрібно використовувати, getattrви можете просто отримати аргументи як атрибути, наприклад, self.categoryабо як ми бачимо у відповідіself.domain
Стівен Альмерот

31

Попередні відповіді були правильними, але вам не потрібно декларувати конструктор ( __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

І це просто працює.


4
Правда. Введіть темну сторону пітона.
Барні

14

Для передачі аргументів командою обходу

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','')

Хороший, надійний та гнучкий!
nealmcb

8

Аргументи павука передаються під час виконання команди обходу за допомогою параметра -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]
        #

...

це буде працювати :)


0

Крім того, ми можемо використовувати 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.