У меня есть рабочий (в большинстве случаев) код для очистки сайта электронной коммерции.Я начинаю с URL-адреса и сканирую основные категории, затем захожу на одного юриста для сканирования подкатегорий и повторяю те же действия, пока не попаду на страницу продуктов.
Это выглядит так:
class ExampleSpider(scrapy.Spider):
name = "example_bot" # how we have to call the bot
start_urls = ["https://......html"]
def parse(self, response):
for link in response.css('div.mvNavSub ul li a::attr(href)').extract():
yield response.follow(link, callback = self.parse_on_categories) #going to one layer deep from landing page
def parse_on_categories(self, response):
for link in response.css('div.mvNavSub ul li a::attr(href)').extract():
yield response.follow(link, callback = self.parse_on_subcategories) #going to two layer deep from landing page
def parse_on_subcategories(self, response):
(same code than above)
def parse_data(self, response):
(parse data)
Я заметил, что для некоторых частей веб-сайта мне нужно углубиться в подкатегории, чтобы иметь возможность анализировать продукты.Поскольку я всегда повторно использую один и тот же код для сканирования категорий, мне интересно, можно ли было просто повторно использовать первую функцию, пока не останется больше категорий для сканирования.Вот что я попробовал:
def parse(self, response):
for link in response.css('div.mvNavSub ul li a::attr(href)').extract():
yield response.follow(link, callback = self.parse_on_categories)
def parse_on_categories(self, response):
if response.css('div.mvNavSub ul li a::attr(href)').extract(): # if there is categories to crawl
self.parse(response)
else:
self.parse_data(response)
def parse_data(self, response):
Если есть категории для сканирования, я бы хотел, чтобы parse_on_categories вызывала первую функцию.Если нет, нужно вызвать parse_data.
Но пока я не могу заставить его работать, поэтому, если бы вы могли поставить меня на трек, это было бы очень признательно :) спасибо