Scrapy Crawlspider не вызывает правила рекурсивно - PullRequest
0 голосов
/ 20 июня 2020

Из того, что я прочитал, scrapy должен go выполнять правила, начиная с первого, прежде чем каждый раз вызывать обратный вызов. Кажется, что это не относится к приведенному ниже коду. Моя цель - очистить категорию форума, поэтому я хочу, чтобы мой паук проходил итерацию по странице этой категории, а также заходил в каждый поток и просматривал страницы обсуждения. Как для страницы категории, так и для потока xpath одинаковый, поэтому мое первое правило должно помочь. Когда я запускаю этого паука, я замечаю, что первое и второе правила выполняют свою работу, мой обратный вызов распечатывает все ссылки каждого потока, а также ссылки на следующие страницы категории. Однако это не рекурсивно, кажется ... Есть идеи, почему?

Чтобы было ясно, что извлекает этот код:

Что он должен извлечь поверх этого:

  • Ссылки на потоки со следующих страниц
  • Ссылки на следующие страницы из потоков

Правильно ли я предполагаю, что это путь к go, и правила будут запускаться второй раз с каждым элементом который был найден по тем же правилам до перехода к обратному вызову?

name = 'myforum'
allowed_domains = ['myforum.com']
start_urls = ['https://myforum.com/category']

rules = (
    Rule(LinkExtractor(
            allow_domains=allowed_domains,
            restrict_xpaths='//a[@class="pagination_page"]',
        ),
    callback="parse_item"
        
    ),
    Rule(LinkExtractor(
            allow_domains=allowed_domains,
            restrict_xpaths='//*[@class="thread-subject"]/..',
        ),
    callback="parse_item"
    ),
)

def parse_item(self, response):
    self.logger.info('*** PARSING ***')
    print(response.url)

Изменить: я обнаружил, что удаление обратного вызова по первому правилу заставит паука перемещаться по страницам. Похоже, это потому, что он вызовет метод parse, который нужен CrawlSpider. Но как теперь переходить на страницы, когда я нахожусь в затруднительном положении? Учитывая, что на этом этапе мне также нужно использовать мою собственную функцию parse_item

...