Из того, что я прочитал, 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