Правила Scrapy CrawlSpider для сканирования одной страницы - PullRequest
0 голосов
/ 17 июня 2019

Я устанавливаю правила паука динамически на основе аргумента сценария, и я хочу установить правила, которые предотвращают сканирование более чем одной страницы или переходят по всем ссылкам, и все сканирование зависит от аргумента.

Вот мой код

from scrapy.exceptions import CloseSpider
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class LinksExtractor3Spider(CrawlSpider):
    name = 'links_extractor3'
    allowed_domains = ['books.toscrape.com']
    start_urls = ['http://books.toscrape.com/']

    def __init__(self, *args, **kwargs):
        self.flow = kwargs.get('flow')
        if self.flow == 'multi':
            print('multi')
            self.rules = (
                Rule(LinkExtractor(), callback='parse_item',     follow=True),
            )
        else:
            print('single')
            print(self.start_urls[0])
            self.rules = (
                Rule(LinkExtractor(), callback='parse_item',     follow=False),
            )
        super(LinksExtractor3Spider, self).__init__(*args, **kwargs)


    def parse_item(self, response):
        item = {}
        item['title'] = response.xpath('//head/title/text()').extract()
        item['url'] = response.url
        yield item

Я пытался использовать правило (LinkExtractor (), callback = 'parse_item', follow = False), но похоже, что я не понимаю Rule =)) Follow = False не мешает следовать.

Также я попытался установить LinkExtractor (allow = ('start_urls [0]')) или добавить еще одну функцию parse_one_item и другой обратный вызов для функции правила следующим образом:

else:
    print('single')
    print(self.start_urls[0])
    self.rules = (
    Rule(LinkExtractor(), callback='parse_one_item', follow=False),
            )
    super(LinksExtractor3Spider, self).__init__(*args, **kwargs)

def parse_one_item(self, response):
    print('I COUNTER {}'.format(self.i))
    if self.i != 0:
        raise CloseSpider('finished')
    else:
        item = {}
        item['title'] = response.xpath('//head/title/text()').extract()
        item['url'] = response.url
        self.i += 1
        yield item

Но все это не работает должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...