Создать переменную экземпляра класса в Scrapy Spider - PullRequest
0 голосов
/ 08 марта 2019

Я новичок в питоне. Я хочу создать свой собственный экземпляр класса variable_1, variable_2 в классе Scrapy Spider. Следующий код работает хорошо.

class SpiderTest1(scrapy.Spider):

    name       = 'main run'
    url        = 'url example'  # this class variable working find
    variable_1 = 'info_1'       # this class variable working find
    variable_2 = 'info_2'       # this class variable working find

    def start_requests(self):
        urls = [self.url]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        print (f'some process with {self.variable_1}')
        print (f'some prcesss with {self.variable_2}')


# start run the class
process = CrawlerProcess(get_project_settings())   
process.crawl(SpiderTest1())
process.start()

Но я хочу сделать экземпляр класса переменным, чтобы мне не приходилось изменять значение переменной внутри паука каждый раз, когда я его запускаю. Я решил создать def __init__(self, url, varialbe_1, variable_2) в пауке-скрапе, и я ожидаю использовать SpiderTest1(url, variable_1, variable_2) для его запуска. Ниже приведен новый код, который я ожидаю получить, как и приведенный выше код, но он не работает должным образом:

class SpiderTest1(scrapy.Spider):

    name = 'main run'

    # the following __init__ are new change, but not working fine
    def __init__(self, url, variable_1, variable_2):
        self.url = url                 
        self.variable_1 = variable_1
        self.variable_2 = variable_2

    def start_requests(self):
        urls = [self.url]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        print(f'some process with {self.variable_1}')
        print(f'some prcesss with {self.variable_2}')

# input values into variables
url        = 'url example'  
variable_1 = 'info_1'       
variable_2 = 'info_2' 

# start run the class
process = CrawlerProcess(get_project_settings())   
process.crawl(SpiderTest1(url, variable_1, variable_2)) #it seem this code doesn't work
process.start()

Итог:

TypeError: __init__() missing 3 required positional arguments: 'url', 'variable_1', and 'variable_2'

Спасибо, когда кто-нибудь может рассказать, как этого добиться.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Спасибо, мой код работает нормально у вас. Но я нахожу вещи немного отличающимися от Обычные практики

это наш код:

process.crawl(SpiderTest1, url, variable_1, variable_2)

это из Обычные практики

process.crawl('followall', domain='scrapinghub.com')

Первая переменная, которую вы предлагаете, использует имя класса SpiderTest1, а другая - строку 'followall'

Что означает 'followall'? Это относится к каталогу: testspiders/testspiders/spiders/followall.py или просто к переменной класса name = 'followall' в followall.py

Я спрашиваю это, потому что я все еще в замешательстве, когда мне нужно позвонить string или class name в пауке-скрапе.

Спасибо.

0 голосов
/ 08 марта 2019

В соответствии с Общепринятой практикой и Документация API , вы должны вызвать метод crawl, подобный этому, чтобы передать аргументы конструктору паука:

process = CrawlerProcess(get_project_settings())   
process.crawl(SpiderTest1, url, variable_1, variable_2)
process.start()

ОБНОВЛЕНИЕ: В документации также упоминается эта форма запуска паука:

process.crawl('followall', domain='scrapinghub.com')

В этом случае 'followall' - это имя паука в проекте (т.е. значение name атрибут класса паука).В вашем конкретном случае, когда вы определяете паука следующим образом:

class SpiderTest1(scrapy.Spider):
    name = 'main run'
    ...

, вы будете использовать этот код для запуска вашего паука, используя имя паука:

process = CrawlerProcess(get_project_settings())   
process.crawl('main run', url, variable_1, variable_2)
process.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...